Wie kann ich einen abgelehnten Prozess zurückfordern?

12

Ähnlich wie bei vielen früheren Fragen habe ich einen Job ausgeführt, von dem ich wünschte, ich hätte ihn auf dem Bildschirm ausgeführt. Ich musste den Prozess ablehnen, weil ich die Verbindung trennen musste. Nachdem ich mich wieder verbunden habe, sehe ich, dass der Prozess noch läuft. Wie kann ich den Prozess "zurückfordern", damit ich seine Ausgabe sehen und ihm Eingaben geben kann?

Diese Frage unterscheidet sich vom einfachen Verschieben eines laufenden Prozesses auf den Bildschirm darin, dass verlorene Standard- / Ausgangs- / Fehler-Handles erneut geöffnet werden.

Sparr
quelle

Antworten:

6

Dies ist eine doppelte Frage - siehe Verschieben eines bereits laufenden Prozesses auf Screen , der auf retty verweist. Dies ist ein selbst beschriebener schrecklicher Hack, der das implementiert, was ich immer vermutet hatte, aber nie wirklich versucht hatte: Es findet fd 0, 1 , und 2 (Standard in, out bzw. Fehler) für den Prozess und haftet an ihnen, wie ein schrecklicher aberranter Parasit, der nicht sein sollte.

mattdm
quelle
Ich wusste nichts über dieses Programm - obwohl die Wahrheit gesagt ist, ist es keine gute Praxis, es zu benutzen! Trotzdem eine gute Antwort.
Andrew M.
6

Indem Sie den Prozess ablehnen, möchten Sie effektiv, dass er die vom Terminal ausgegebenen SIGHUPs ignoriert. Sobald Sie Ihre Sitzung schließen (z. B. bash), wird dieser Prozess in den Besitz von init übergehen. Wenn Sie also sagen, dass Sie einen Prozess wieder besitzen möchten, nachdem Sie den Besitz aufgegeben haben, möchten Sie den Besitz von einem anderen Prozess übernehmen - der nicht implementiert ist, und das aus gutem Grund. Dies ist unter Linux einfach nicht möglich.

Andrew M.
quelle
1
Prozesse besitzen so etwas nicht. Ein nicht genehmigter Prozess wird noch ausgeführt.
Mattdm
Sie tun dies, sobald die Elternsitzung geschlossen wurde - wie aus seiner Frage hervorgeht. Ich habe meine Antwort aktualisiert, um dies widerzuspiegeln.
Andrew M.
Der übergeordnete Prozess wird in init geändert, unterscheidet sich jedoch vom Besitz. Die EUID und UID des Prozesses bleiben die des ursprünglichen Benutzers. Andernfalls könnte dies möglicherweise ausgenutzt werden, da jeder Benutzer plötzlich die Möglichkeit hätte, Code als ein anderer Benutzer und nicht weniger als ein Systembenutzer auszuführen.
Mattdm
1
EUID / UID! = PPID. Ich spreche von Prozessbesitz, nicht von Berechtigungen.
Andrew M.
Ja, ich denke, wir sind uns über alles einig, außer über die Bedeutung des Begriffs "Prozessverantwortung". Dies bezieht sich auf die Benutzer-ID, mit der der Prozess verknüpft ist, nicht auf den übergeordneten Prozess. Vielleicht ist die Verwirrung auf den disownbash-spezifischen Befehl zurückzuführen, der trotz des Namens eigentlich nichts mit dem Ändern der Prozessverantwortung zu tun hat.
Mattdm