Ich arbeite derzeit an einem Projekt, das ergänzt werden muss, inittab
damit 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 inittab
das 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 inittab
Skript 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-reload
undsystemctl 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 q
init anweisen, neu zu laden. /etc/inittab
Das geschieht nicht automatisch. Ich denke, Sie haben das getan, da Sie die Re-reading inittab
Meldung (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 init
Prozess verfügt über eine sehr eingeschränkte Umgebung. Ändern Sie bei Bedarf das Wrapper-Skript, um alle erforderlichen Variablen festzulegen.
Antwort4
Wenn init
einBefehlUm es auszuführen inittab
, verzweigt es eine Shell und sendet dieBefehlals Parameter für den exec
Befehl 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 "$@"