Fügen Sie inittS unter OpenSuse 12.1 ein Element hinzu

7

Ich arbeite derzeit an einem Projekt, das hinzugefügt werden muss, inittabdamit das Programm beim Start geladen wird.

Das Programm, das ich starten möchte, ist eine AC # Mono-Anwendung. Ich habe ein Startskript erstellt und wenn das Startskript manuell ausgeführt wird, wird das Programm einwandfrei gestartet. Wenn ich es in inittabdas Programm stecke , wird es jedoch nicht gestartet.

Ich habe eingecheckt, /var/log/messagesaber es heißt nicht, dass etwas nicht stimmt. Es heißt nur, dass es neu geladen wird.

Unten ist das, was ich meinem inittabSkript hinzugefügt habe

bes:2345:respawn:/home/bits/MyProgram/start.myprogram

Vielen Dank für jede Hilfe, die Sie leisten können

UPDATE Unten finden Sie den Code im Startskript, der sich in / home / bits / MyProgram befindet.

#!/bin/sh

cd /home/bits/MyProgram

/usr/bin/mono EmailServer.exe "$@"

Ich habe auch versucht,> mylog.txt am Ende der Zeile hinzuzufügen, beginnend mit / usr / bin / mono, z

/ usr / bin / mono EmailServer.exe "$ @"> mylog.txt

Wenn ich das Startskript manuell ausführe, funktioniert es einwandfrei, auch wenn ich mich nicht in dem Verzeichnis befinde, in dem sich das Startskript befindet. Wenn ich es zu inittab hinzufüge und telinit q ausführe, wird es nie gestartet und das Protokoll wird nicht geschrieben, aber Das Protokoll wird geschrieben, wenn ich das Programm manuell starte.

Vielen Dank für jede Hilfe, die Sie leisten können.

Boardy
quelle
Schlimm genug, dass Sie Mono auf einem Linux-System verwenden. Aber es ist schrecklich, es in Inittab zu legen. Suchen Sie nach einem richtigen Skript /etc/init.d/.
Nils
Welche Distribution verwenden Sie und was meinen Sie mit inittab script?
Ulrich Dangel
@UlrichDangel Ich verwende OpenSuse 12.1 und mit inittab meine ich / etc / inittab, wo Sie Dinge hinzufügen können, die beim Start geladen werden sollen.
Boardy

Antworten:

4

Das Problem ist einfach: Sie verwenden OpenSuse 12.1, das systemd anstelle Ihres klassischen System V-Boot-Systems verwendet .

Um einen neuen Service-Ort zu installieren, erstellen Sie die folgende Datei in /etc/systemd/system/myprogname.service

[Unit]
Description=My progname service file

[Service]
ExecStart=/home/bits/MyProgram

[Install]
WantedBy=multi-user.target

Achtern laufen systemctl daemon-reloadundsystemctl start myprogname.service

Wenn Sie MyProgname automatisch neu starten möchten, müssen Sie hinzufügen

Restart=restart-always

zum Serviceabschnitt.

Ulrich Dangel
quelle
Vielen Dank für Ihre Hilfe, das hat mich verrückt gemacht, das ist sehr verborgen im Vergleich zu inittab
Boardy
6

Platzieren Sie Ihr Programm irgendwo.

Kopieren und bearbeiten Sie die Skelettvorlagendatei für die Init-Jobsteuerung unter /etc/init.d/skeleton .

Ändern Sie diese Datei, um anzugeben, WELCHEN Runlevel Sie möchten. In Ihrem Beispiel, 2,3,4,5, gibt es oben in der Datei (in Kommentaren) Optionen, um die gewünschten Runlevel anzugeben

Platzieren Sie diese neue Datei mit einem beschreibenden Namen in /etc/init.d . ( myfancyname im Beispiel verwendet)

Eine plattformunabhängige Methode, um dies zu testen oder zu aktivieren / deaktivieren (wenn Sie die Skelettdatei verwendet haben)

sudo /etc/init.d/myfancyname start
sudo /etc/init.d/myfancyname stop
sudo /etc/init.d/myfancyname restart

Es gibt verteilungsspezifische Methoden, um dieselben Aktionen auszuführen. Beispielsweise verwendet Debian update-rc.d myfancyname [start | stop | enable | disable ...].

Das Ändern von inittab ist im Allgemeinen eine schlechte Idee. Wenn Sie es vermasseln, startet das System nicht mehr und Sie haben ZWEI Probleme. (kein regulärer Ausdruck erforderlich!)

Das Hinzufügen von Skripten zum Unterverzeichnis /etc/init.d/ ist standardisierter und kann mit fast JEDER Linux-Variante verwendet werden, wahrscheinlich mit einigen * nix-Dateien, möglicherweise einigen BSDs.

lornix
quelle
3

Sie müssen ausführen telinit q, um init anzuweisen /etc/inittab, neu zu laden. Dies wird nicht automatisch ausgeführt. Ich denke, Sie haben das getan, seit Sie die Re-reading inittabNachricht (Sie haben diese Nachricht gesehen, richtig?) In den Systemprotokollen erwähnt haben.

Ist das Problem, dass Ihr Prozess überhaupt nicht startet oder dass Ihr Programm beim Start fehlschlägt? Schreiben Sie ein Wrapper-Skript, das Fehler in eine Protokolldatei umleitet:

#!/bin/sh
exec >/var/log/myprogram.log 2>&1 
exec /home/bits/MyProgram/start.myprogram

Überprüfen Sie, ob die Protokolldatei erstellt wurde, und prüfen Sie, ob darin Fehler auftreten.

Eine Sache, die Ihnen in den Sinn kommt, ist, dass Ihr Programm möglicherweise Umgebungsvariablen benötigt, die in Ihrer Sitzung festgelegt werden. Der initProzess hat eine sehr begrenzte Umgebung. Ändern Sie gegebenenfalls das Wrapper-Skript, um alle erforderlichen Variablen festzulegen.

Gilles 'SO - hör auf böse zu sein'
quelle
Es tut mir leid, dass ich eine Weile gebraucht habe, um mich bei Ihnen zu melden. Meine virtuelle Testmaschine hat nicht mehr funktioniert. Ich habe eine Weile gebraucht, um herauszufinden, was nicht stimmte. Wie auch immer, ich habe versucht, was Sie vorgeschlagen haben, aber das startet auch nicht, es ist nicht mein Programm, das nicht startet, es startet einfach nie das Programm. Ich habe den Inhalt meines Startskripts zu meiner Frage hinzugefügt, falls es hilft.
Boardy
@Boardy Haben Sie versucht, einen absoluten Pfad für die Protokolldatei anzugeben? Sehen Sie die Re-reading inittabNachricht?
Gilles 'SO - hör auf böse zu sein'
Ja, ich habe das versucht und es heißt, dass es neu geladen wird, nachdem ich telinit q
Boardy
1

Wenn initein Befehl gelesen wird , in dem ausgeführt werden soll inittab, wird eine Shell gegabelt und der Befehl als Parameter an den execBefehl in dieser Shell gesendet. Überprüfen Sie also, was passiert, wenn Sie dies manuell tun:

sh -c exec /home/bits/MyProgram/start.myprogram

Eine andere Sache, die ich versuchen würde, wäre, das Launcher-Skript vollständig zu umgehen, mit so etwas in inittab:

bes:2345:respawn:/usr/bin/mono /home/bits/MyProgram/EmailServer.exe "$@"
Marios Zindilis
quelle
Hallo Danke für Ihre Hilfe, keiner von beiden hat funktioniert, beide Versuche laufen nicht
Boardy
Wenn das Programm nicht mit dem ersten Befehl ausgeführt wird, wird es nicht ausgeführt. inittabSie müssen daher vorübergehend ignorieren inittabund Fehler beheben, warum das Skript im Allgemeinen nicht gestartet wird. Ist /home/bits/MyProgram/start.myprogramausführbar?
Marios Zindilis
Ja, wenn ich es von einem beliebigen Ort auf dem Server ausführen kann, muss die Datei nicht unbedingt dort gespeichert sein, wo das Programm erfolgreich gestartet wurde.
Boardy
@MariosZindillis Ich habe gerade herausgefunden, ob ich die ausführbare Datei anstelle des Startskripts ausführe. exec /home/bits/MyProgram/EmailServer.exeEs wird ein Fehler -bash: /home/bits/EmailServer/EmailServer.exe: Permission denied -bash: exec: /home/bits/EmailServer/EmailServer.exe: cannot execute: Permission denied
angezeigt, der
@MariosZindillis Ich habe gerade versucht, ein Basisskript auszuführen, das nicht versucht, mein Programm auszuführen. Stattdessen wird nur ein Wort in eine Datei geschrieben, und diese Datei wird nie geschrieben, aber wenn ich das Skript manuell ausführe, geschieht dies.
Boardy