Ich arbeite derzeit an einem Projekt, das hinzugefügt werden muss, inittab
damit 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 inittab
das Programm stecke , wird es jedoch nicht gestartet.
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 ist das, was ich meinem inittab
Skript 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.
Antworten:
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
Achtern laufen
systemctl daemon-reload
undsystemctl start myprogname.service
Wenn Sie MyProgname automatisch neu starten möchten, müssen Sie hinzufügen
zum Serviceabschnitt.
quelle
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)
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.
quelle
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 dieRe-reading inittab
Nachricht (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:
Ü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
init
Prozess hat eine sehr begrenzte Umgebung. Ändern Sie gegebenenfalls das Wrapper-Skript, um alle erforderlichen Variablen festzulegen.quelle
Re-reading inittab
Nachricht?Wenn
init
ein Befehl gelesen wird , in dem ausgeführt werden sollinittab
, wird eine Shell gegabelt und der Befehl als Parameter an denexec
Befehl in dieser Shell gesendet. Überprüfen Sie also, was passiert, wenn Sie dies manuell tun:Eine andere Sache, die ich versuchen würde, wäre, das Launcher-Skript vollständig zu umgehen, mit so etwas in inittab:
quelle
inittab
Sie müssen daher vorübergehend ignoriereninittab
und Fehler beheben, warum das Skript im Allgemeinen nicht gestartet wird. Ist/home/bits/MyProgram/start.myprogram
ausführbar?exec /home/bits/MyProgram/EmailServer.exe
Es wird ein Fehler-bash: /home/bits/EmailServer/EmailServer.exe: Permission denied -bash: exec: /home/bits/EmailServer/EmailServer.exe: cannot execute: Permission denied