Was passiert mit der Ausgabe eines Prozesses, der enteignet wurde und sein Terminal verloren hat?

26

Wenn ich das virtuelle Terminal schließe, in dem ein Prozess gestartet wurde, wird die Ausgabe direkt an /dev/nulloder kann sie den Speicher irgendwie verschmutzen? Kann ich die Ausgabe trotzdem abrufen, um sie zu einem späteren Zeitpunkt weiterzulesen?

[EDIT]: Ist der Moment des Verleugnens eines Prozesses tatsächlich ein Ende meiner Macht, seine Ausgabe zu kontrollieren?

Mir ist auch aufgefallen, dass, wenn ich einen gestoppten Prozess ablehne, zunächst alles normal erscheint: Er wird weder abgebrochen noch in Jobs angezeigt. Wenn ich mich jedoch auslogge (und damit nicht das Terminal schließe, sondernsu zum Beispiel einfach das Terminal verlasse ), wird der Vorgang abgebrochen. Trotzdem kann ein im Hintergrund laufender, nicht freigegebener Prozess weiter ausgeführt werden.

rozcietrzewiacz
quelle
2
Für die "kann ich sowieso die Ausgabe greifen": nicht ohne schmutzige Tricks. Aber siehe Wie kann ich einen laufenden Prozess deaktivieren und ihn einer neuen Bildschirmshell zuordnen? und andere zitierte Fragen für schmutzige Tricks (alle basieren auf dem Anhängen eines Debuggers an das Programm und dem Öffnen einer anderen Ausgabedatei).
Gilles 'SO- hör auf böse zu sein'
Danke für den Link zu dieser Frage. Es gab mir die beste Antwort bis jetzt! Besonders das clevere rettyProgramm.
Rozcietrzewiacz
1
Siehe auch diese Antwort auf eine verwandte Frage.
Stéphane Gimenez

Antworten:

11

Die Tatsache, dass ein Prozess "disowned" ist, hat nur eine Bedeutung für die interaktive Shell, die diesen Prozess erstellt hat. Dies bedeutet, dass die Shell den Prozess nicht mehr in ihre Auftragstabelle aufnimmt und dass SIGHUP beim Beenden der Shell nicht an diesen Prozess gesendet wird. Es hängt nicht wirklich mit Ihren Fragen zusammen.

Was passiert mit den Ausgaben, die an ein gelöschtes virtuelles Terminal gesendet werden /dev/pts/x? Ich habe selbst einige Tests durchgeführt und festgestellt, dass Geräte nicht zugänglich sind und erst wieder zugewiesen werden, wenn alle darauf verweisenden Dateideskriptoren geschlossen wurden. Daher sehe ich keinen Grund, warum Schreibvorgänge auf einem gelöschten Terminal gespeichert werden. Ich denke, dies wird nicht einmal von POSIX definiert.

Ich glaube nicht, dass es möglich ist, die Ausgabe eines Prozesses zu erfassen, der in ein Terminal schreibt, auch wenn das Terminal noch aktiv ist¹. Alles, was Sie tun können, ist, die direkte Eingabe in das Terminal zu übernehmen (dh Tastenanschläge oder simulierte Tastenanschläge durch den Master-Teil eines Pty). Wenn Prozesse auf stdin lesen würden, was auf ihre Terminals geschrieben ist, würde dies für die meisten Prozesse zu einer Selbstschleife führen.

Über die letzte Bemerkung zur Prozessbeendigung weiß ich nicht genau, was passiert, aber ich würde eher merkwürdige Verhaltensweisen bei Signalen (SIGTTOU, SIGTTIN, SIGHUP oder andere) im Zusammenhang mit dem Vordergrund- / Hintergrundstatus von Prozessgruppen während der Sitzung vermuten Leader-Exits (z. B. suin dem von Ihnen erwähnten Fall).

Antwort auf die Änderung : Nein, in Bezug auf die Ausgabe ändert sich nichts, wenn ein Prozess abgelehnt wird: Er ist immer noch an sein steuerndes Terminal gebunden (es sei denn, er hat sich bereits getrennt, wie es Dämonen tun). Sie können das mit sehen ps. Sie werden jedoch nicht in der Lage sein zu verwenden fg/ bg/ jobsBefehle von dem Shell mehr für diesen Prozess zur Verfügung gestellt. Das bedeutet, dass es möglicherweise schwierig ist, ihm Eingaben vom Terminal zuzuführen (muss sich in der Vordergrundprozessgruppe befinden).

-
1. es sei denn, der Prozess ist dazu bereit oder wird mit einigen Debugging-Tools überfallen (siehe Kommentare oben).

Stéphane Gimenez
quelle
1
Vielen Dank für die Klarstellung. Eigentlich hängt die Tatsache, dass ein Prozess abgelehnt wird, immer noch mit meiner Frage zusammen: Nachdem ich einen Prozess abgelehnt habe, scheine ich die Fähigkeit zu verlieren, seine Ausgabe zu kontrollieren, oder? (Auch wenn das Terminal noch nicht geschlossen wurde.) Ich bearbeite die Frage, um diesen Fall einzuschließen.
rozcietrzewiacz
4

Nur um diese spezielle Frage anzusprechen:

Wenn ich das virtuelle Terminal schließe, in dem ein Prozess gestartet wurde, wird die Ausgabe direkt an / dev / null gesendet oder kann sie den Speicher irgendwie verschmutzen?

Das Terminal und die damit verbundenen Programme kommunizieren über ein tty-Gerät, indem sie es wie eine Datei lesen und schreiben. Insbesondere erstellt ein virtuelles Terminal ein "Pseudo-tty" (kurz "pty") und erzeugt dann einen Shell- (oder anderen) Prozess und verbindet das stdin / out / err dieses Prozesses mit dem pty. (Die Details variieren je nach Betriebssystem.)

Wenn Sie das virtuelle Terminal schließen, schließt das virtuelle Terminal das Ende der Verbindung (das Pty "Master"). Wenn das Programm am anderen Ende der Verbindung auf tty schreibt, wird ein Fehler zurückgegeben und die Daten gehen nirgendwo hin. Ebenso wird beim Lesen von tty ein EOF-Indikator (Dateiende) zurückgegeben.

Chris Page
quelle
Danke - schöne und klare Erklärung aus etwas mehr Programmiersicht.
Rozcietrzewiacz
0

Dank eines Kommentars von Gilles, der mich auf diese Frage hinwies , erfuhr ich von einem Programm namens Retty .

Es scheint, als würde ein schmutziger Hack verwendet, um eine (Pseudo-) Tty erneut zu verknüpfen, sodass die Ausgabe eines Prozesses weiterhin gelesen werden kann - unabhängig davon, ob er missbilligt wurde oder nicht. Das scheint also den größten Teil meiner Frage zu beantworten. Der zweite wurde von Stéphane beantwortet .

rozcietrzewiacz
quelle