
Einführung
Ich habe vor Kurzem auf Fedora 17 aktualisiert und gewöhne mich an den neueren systemctl
Daemon-Manager im Vergleich zu Shell-Init-Skripten.
Eine Funktion, die ich für einige meiner Daemons benötige, ist die Möglichkeit,mit ihren Konsolen interagierenweil unsaubere, nicht vom Prozess selbst initiierte Herunterfahren zu Datenbankbeschädigungen führen können. So systemctl stop service-name.service
kann beispielsweise das Ausführen eines solchen Vorgangs zu irreversiblem Datenverlust führen.
Diese Konsolen lesen Benutzereingaben über stdin oder ähnliche Methoden, also habe ich auf meinem alten Betriebssystem diese Daemons in einer Sitzung in den Vordergrund gestellt screen
, und ichausgesetztdiese Bildschirmsitzung mit ^A ^z
. Es ist auch erwähnenswert, dass ich systemctl
dies jetzt automatisch durchgeführt habe, wenn der Computer neu gestartet wird, aber es löst immer noch nicht mein potenzielles Datenbeschädigungsproblem, das ich vermeiden möchte.
Meine Frage
Gibt es eine Möglichkeit, systemctl
direkt mit der Konsole der von ihm erzeugten Prozesse zu interagieren? Kann ich einen Prozess durchhängen, systemctl
um Zugriff auf seine Konsole zu erhalten?
Danke
Ihr gebt immer tolle Antworten, also wende ich mich an euch!
Antwort1
Es sieht so aus, als könnten Sie es auf ein TTY umleiten.
StandardInput=
Steuert, womit der Dateideskriptor 0 (STDIN) der ausgeführten Prozesse verbunden ist. Akzeptiert einen der folgenden Werte: null, tty, tty-force, tty-fail oder socket. Wenn null ausgewählt ist, wird die Standardeingabe mit /dev/null verbunden, d. h. alle Leseversuche des Prozesses führen zu einem sofortigen EOF. Wenn tty ausgewählt ist, wird die Standardeingabe mit einem TTY verbunden (wie durch TTYPath= konfiguriert, siehe unten) und der ausgeführte Prozess wird zum Steuerungsprozess des Terminals. Wenn das Terminal bereits von einem anderen Prozess gesteuert wird, wartet der ausgeführte Prozess, bis der aktuelle Steuerungsprozess das Terminal freigibt.tty-force ist ähnlich wie tty, aber der ausgeführte Prozess wird zwangsweise und sofort zum Steuerungsprozess des Terminals gemacht, wobei möglicherweise vorherige Steuerungsprozesse vom Terminal entfernt werden.tty-fail ist ähnlich wie tty, aber wenn das Terminal bereits einen steuernden Prozess hat, schlägt der Start des ausgeführten Prozesses fehl. Die Socket-Option ist nur bei Socket-aktivierten Diensten gültig und nur, wenn die Socket-Konfigurationsdatei (siehe systemd.socket(5) für Details) nur einen einzigen Socket angibt. Wenn diese Option gesetzt ist, wird die Standardeingabe mit dem Socket verbunden, von dem aus der Dienst aktiviert wurde, was in erster Linie für die Kompatibilität mit Daemons nützlich ist, die für die Verwendung mit dem traditionellen inetd(8)-Daemon entwickelt wurden. Diese Einstellung ist standardmäßig null.
Oh, und wenn das nicht funktioniert, machen wir etwas wirklich Kompliziertes mit Unix-Sockets, von dem ich sicher bin, dass SieLiebe.
Scheiß auf diesen Unsinn, versuchen Sie es mit etwas wie dem Folgenden, wenn das Obige nicht akzeptabel ist:
Sie könnten versuchen, in das /proc-PID-Verzeichnis zu schreiben. Angenommen, die PID Ihres Daemons ist 2000, versuchen Sie, in /proc/2000/fd/0 zu schreiben.
Sie können diese Zeile zu ExecStop= hinzufügen, wodurch Sie keinerlei manuelle Interaktion mehr benötigen.