Antworten:
Angesichts der Funktionsweise von Linux-Jobs und der Prozessverantwortung ist es leider nicht möglich, einen Prozess ohne die Hilfe des Einführungsprozesses neu zu besitzen.
Ein Elternteil kann ein Kind "ablehnen", das dann vom Prozess "init" "adoptiert" wird. Die Systemsicherheit verhindert, dass jemand die Prozesse eines anderen erfasst. Wenn Sie es ablehnen, wird ein Prozess von jemand anderem (Init) gesteuert. Sie als 'Benutzer' könnten den Vorgang immer noch abbrechen, aber Sie können ihn nicht zurückbekommen. Es ist unwahrscheinlich, dass init gezwungen wird, Ihren Prozess zurückzugeben, da init nicht einmal E-Mails liest.
So gemein es auch klingt, es läuft wirklich auf die Antwort "Tu das nicht!" Hinaus.
reptyr
(siehe meine Antwort für ein Verwendungsbeispiel).
Ich gehe zwar davon aus, dass dies niemandem in der unglücklichen Situation hilft, den falschen Prozess abgelehnt zu haben, wenn Sie die Ablehnung aus Ihrem Workflow verbannen und durch Folgendes ersetzen:
https://github.com/nelhage/reptyr
Sie können jeden Vorgang reparieren (dh innerhalb des Bildschirms verschieben).
reptyr
ist die Lösung, aber es besteht keine Notwendigkeit, die Verwendung zu beenden disown
. Zur Klarheit habe ich eine neue Antwort geschrieben.
Alles was Sie brauchen ist reptyr
. Es lebt auf GitHub und ist seit Wheezy für Debian und wahrscheinlich auch für andere GNU / Linux-Distributionen gepackt. Es wird Ihren nicht genehmigten Prozess im aktuellen Terminal in den Vordergrund rücken, wenn Sie ihn mit seiner Prozess-ID (PID) aufrufen. Also zum Beispiel:
pgrep -f DISOWNED_PROCESS # to find out the PID of the disowned process
reptyr PID # insert this PID here
Entschuldige Nein. Im Prinzip wäre es möglich, da durch Disowning lediglich ein interner Status der Shell geändert wird - im Grunde wird die Prozess-ID aus einer Liste entfernt, und es könnte ohne allzu großen Aufwand zurückgesetzt werden (Sie müssten beim Testen etwas vorsichtig sein) Die angehängte PID befindet sich in der richtigen Sitzung, ist aber nicht unüberwindbar. Aber keine der üblichen Shells (bash, ksh, tcsh, zsh) scheint eine Möglichkeit zum erneuten Hinzufügen zu haben. (Obwohl mit zsh können Sie das schreiben jobstates
, jobdirs
und jobtext
assoziative Arrays, ich weiß nicht , wie viel man auf diese Weise erreichen können.)
Wenn die Shell Signale an den nicht freigegebenen Prozess senden soll, wie dies für die zugehörigen Unterprozesse der Fall ist, können Sie einen Stub-Job schreiben, der wartet, bis er ein Signal empfängt und dasselbe Signal an den nicht freigegebenen Prozess sendet. Sie können senden SIGSTOP
und SIGCONT
an den nicht genehmigten Prozess, um Ctrl+ Zund zu simulieren bg
. Nichts davon wird so bequem sein wie das Wiederbesitzen.
Wie sind die Umstände? Wenn Sie Ihr Terminal nur für eine Weile zurückbekommen möchten, können Sie stattdessen GNU Screen verwenden. Es ist nicht ganz den Prozess von einem Terminal ab - Bildschirm emuliert einem zum Nutzen des Prozesses - aber man kann es aus dem realen Terminal befestigen und lösen , dass Sie verwenden. Sie können sogar einen Bildschirm trennen, sich abmelden, sich wieder anmelden und eine neue Verbindung zum selben Bildschirm herstellen.