Wenn ich das virtuelle Terminal schließe, in dem ein Prozess gestartet wurde, wird die Ausgabe direkt an /dev/null
oder 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.
quelle
retty
Programm.Antworten:
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.
su
in 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 verwendenfg
/bg
/jobs
Befehle 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).
quelle
Nur um diese spezielle Frage anzusprechen:
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.
quelle
Um den interessantesten Teil Ihrer Frage zu beantworten: Um die Ausgabe eines laufenden Programms zu ändern, müssen Sie dessen Dateideskriptoren bearbeiten. Das geht ganz einfach mit gdb. Es ist ein Hack, aber es funktioniert.
Sehen:
https://stackoverflow.com/questions/593724/redirect-stderr-stdout-of-a-process-after-its-been-started-using-command-line
Ein Hilfsskript ist unter http://users.linpro.no/ingvar/fdswap.sh.txt verfügbar .
quelle
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 .
quelle