Element zu inittab unter OpenSuse 12.1 hinzufügen

Element zu inittab unter OpenSuse 12.1 hinzufügen

Ich arbeite derzeit an einem Projekt, das ergänzt werden muss, inittabdamit das Programm beim Start geladen wird.

Das Programm, das ich zu starten versuche, ist eine ac#-Mono-Anwendung. Ich habe ein Startskript erstellt und wenn das Startskript manuell ausgeführt wird, startet das Programm einwandfrei. Wenn ich es jedoch in inittabdas Programm einfüge, startet es nicht.

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

Unten sehen Sie, was ich meinem inittabSkript hinzugefügt habe

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

Vielen Dank für Ihre Hilfe

AKTUALISIEREN Unten ist der Code im Startskript, das sich in /home/bits/MyProgram befindet.

#!/bin/sh

cd /home/bits/MyProgram

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

Ich habe auch versucht, > mylog.txt an das Ende der Zeile anzufügen, die mit /usr/bin/mono beginnt, zB

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

Wenn ich das Startskript manuell ausführe, funktioniert es einwandfrei, auch wenn ich mich nicht im Verzeichnis befinde, in dem sich das Startskript befindet. Nur wenn ich es zu inittab hinzufüge und telinit q ausführe, startet es nie und es wird nichts ins Protokoll geschrieben. Wenn ich das Programm jedoch manuell starte, wird etwas ins Protokoll geschrieben.

Vielen Dank für Ihre Hilfe.

Antwort1

Legen Sie Ihr Programm irgendwo ab.

Kopieren und bearbeiten Sie die Skelett-Vorlagendatei für die Init-Job-Steuerung unter/etc/init.d/skeleton.

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

Platzieren Sie diese neue Datei in/etc/init.dmit einem beschreibenden Namen. (meinausgefallenerNameim Beispiel verwendet)

Eine plattformunabhängige Methode, um dies zu testen oder zu aktivieren/deaktivieren (wenn Sie dieSkelettDatei)

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

Es gibt distributionsspezifische Methoden, um diese Aktionen auszuführen. Debian verwendet beispielsweiseupdate-rc.d myfancyname [starten|stoppen|aktivieren|deaktivieren…]

Das Ändern von inittab istallgemeinAschlechtIdee: Wenn Sie es vermasseln, bootet das System nicht mehr und dann haben Sie 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, vielleicht mit einigen BSDs.

Antwort2

Das Problem ist einfach, Sie verwenden OpenSuse 12.1, dasVerwendet systemdanstelle Ihres klassischenSystem V-Bootsystem.

Um einen neuen Dienst 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

Danach laufen systemctl daemon-reloadundsystemctl start myprogname.service

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

Restart=restart-always

zum Servicebereich.

Antwort3

Sie müssen telinit qinit anweisen, neu zu laden. /etc/inittabDas geschieht nicht automatisch. Ich denke, Sie haben das getan, da Sie die Re-reading inittabMeldung (Sie haben diese Meldung doch gesehen, oder?) in den Systemprotokollen erwähnt haben.

Liegt das Problem darin, dass Ihr Prozess gar nicht startet oder dass Ihr Programm beim Start abstürzt? 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 wird und ob darin Fehler enthalten sind.

Mir fällt ein, dass Ihr Programm möglicherweise Umgebungsvariablen benötigt, die in Ihrer Sitzung festgelegt werden. Der initProzess verfügt über eine sehr eingeschränkte Umgebung. Ändern Sie bei Bedarf das Wrapper-Skript, um alle erforderlichen Variablen festzulegen.

Antwort4

Wenn initeinBefehlUm es auszuführen inittab, verzweigt es eine Shell und sendet dieBefehlals Parameter für den execBefehl in dieser Shell. Überprüfen Sie also, was passiert, wenn Sie Folgendes manuell tun:

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

Ich würde auch versuchen, das Startskript vollständig zu umgehen, und zwar mit etwas wie dem Folgenden in inittab:

bes:2345:respawn:/usr/bin/mono /home/bits/MyProgram/EmailServer.exe "$@"

verwandte Informationen