Ich versuche hier etwas Seltsames zu tun. Ich muss einen Prozess, logcat, von einem Deamon starten, der im Hintergrund läuft und zum Terminal druckt, ohne Kontrolle über stdin zu nehmen. Es dient zum Protokollieren, daher wird logcat logarithmische Meldungen ausgeben, während der Benutzer weiterhin Standardbefehle eingeben und Programme von der Shell initialisieren kann. Hier ist der Code für den Daemon, den ich bisher habe. Das Programm, logcat, startet und zeigt Logmeldungen an, aber ich kann keine Befehle in stdin eingeben, da das Programm anscheinend die Kontrolle über stdin übernommen hat.
%Vor%Danke
Der Befehl 'logcat' scheint für die Android-Entwicklung zu sein - das könnte etwas seltsam erklären Ort des Befehls.
Die Schlüsseloperation, die Sie beheben müssen, besteht darin, sicherzustellen, dass Sie Ihre aktuelle Standardeingabe (das Terminal) schließen und /dev/null/
für das Eingabegerät öffnen:
Dies bedeutet, dass Ihr daemonisierter untergeordneter Prozess nichts vom Terminal lesen wird.
Was ich denke, dass du willst, ist:
/dev/null
. logcat
in die aktuelle Standardausgabe schreiben. Irgendwann im Laufe des Verfahrens machen Sie Ihre Daemonisierung ordnungsgemäß (den Link ausleihen) von @ bstpierres Antwort), stellen Sie sicher, dass das Terminal, mit dem Sie verbunden sind, nicht Ihr kontrollierendes Terminal ist, sodass Interrupts und Hangups, die an das Terminal gesendet werden, keinen Einfluss auf Ihren Daemon haben. Die Installation ist einfacher als das, was Sie eingerichtet haben - Sie sollten mit der Standardeingabe arbeiten und Standardausgabe und Standardfehler unverändert lassen (anstatt die Ausgaben zu ändern und den Eingang unverändert zu belassen).
Nun möchten Sie vielleicht, dass die Ausgabe zu /dev/console
; Wenn ja, ist es sinnvoll, den Code zu ändern, um /dev/console
zu öffnen. Es ist jedoch nicht sinnvoll, auf /dev/null
zurückzugreifen, wenn Sie /dev/console
nicht öffnen können. Ihr Programm sollte einen Fehler melden und scheitern (weil es keinen Sinn macht, Logcat in /dev/null
zu schreiben!). Stellen Sie sicher, dass Sie die Konsole mit dem O_NOCTTY
-Flag öffnen, damit es nicht zum steuernden Terminal für den Daemon wird.
Der letzte Kommentar, den ich machen würde, ist:
Ich mag es nicht sehr, wenn das passiert.
Siehe auch: SO 958249
Wie man in Linux dämonisiert [toter Link]
So dämonisieren Sie unter Linux [Wayback-Archiv der oben genannten]
gib auf github - Code aus dem obigen Link
Zusammenfassung:
Eines der Dinge, die ich immer wieder durchlaufe, sind Linux-Dämonen, die sich selbst nicht richtig dämonisieren. Um ordnungsgemäß zu dämonisieren, müssen die folgenden Schritte befolgt werden.
- Der Aufruf von fork () wird verwendet, um einen separaten Prozess zu erstellen.
- Der Aufruf setsid () wird verwendet, um den Prozess vom übergeordneten (normalerweise einer Shell) zu trennen.
- Die Dateimaske sollte zurückgesetzt werden.
- Das aktuelle Verzeichnis sollte in etwas Gutartiges geändert werden.
- Die Standarddateien (stdin, stdout und stderr) müssen erneut geöffnet werden.
Wenn Sie einen dieser Schritte nicht ausführen, führt dies zu einem Daemon-Prozess, der sich falsch verhalten kann. Die typischen Symptome sind wie folgt.
- Wenn der Daemon gestartet und dann abgemeldet wird, hängt das Terminal. Dies ist besonders unangenehm mit ssh.
- Das Verzeichnis, aus dem der Daemon gestartet wurde, bleibt gesperrt.
- Falsche Ausgabe erscheint in der Shell, von der der Daemon gestartet wurde.