Bash / ZSH: Disown rückgängig machen

30

Gibt es eine Möglichkeit, einen Prozess wieder an die Shells-Jobtabelle anzuhängen, nachdem er "enteignet" wurde?

Edit: $ SEARCHENGINE fällt mir total aus. Sieht nicht gut aus.

nisc
quelle

Antworten:

16

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.

Lornix
quelle
1
Dies kann nicht richtig sein: Der übergeordnete Prozess kann nicht dazu führen, dass das Kind adoptiert wird, außer durch Beenden. Das von Ihnen beschriebene Verhalten muss vom untergeordneten Prozess (oder vom Kernel, der einen Teil davon automatisch ausführt, wenn der übergeordnete Prozess stirbt) ausgelöst werden. Ein Prozess kann ein Kind nicht freiwillig adoptieren, aber er kann es auch nicht aufgeben.
Gilles 'SO - hör auf böse zu sein'
1
Entschuldigen Sie. Mein Fehler. Zu stark vereinfacht. Durchlief die Bash-Quelle erneut, Bash behält weiterhin das Eigentum, verhindert jedoch, dass Seufzer an den untergeordneten Prozess weitergegeben werden. Es könnte also möglich sein, es zurückzubekommen, aber es ist (noch) nicht in bash eingebaut. Aus irgendeinem Grund steckte ich fest, wie Init Waisen und Zombies erntete.
Lornix
@lomix ja, aber wenn du die Shell verlässt, von der du sie nicht mehr gehört hast, erhält sie eine ppid von 1. Ihre Argumentation ist also gültig. Wer verleugnet, wenn er nicht sowieso gleich
aufbricht
1
Sorry, aber diese Antwort ist falsch. Verwenden Sie einfach reptyr(siehe meine Antwort für ein Verwendungsbeispiel).
Christian Pietsch
18

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).

Thom
quelle
2
Nun, ich habe mein missbilligtes Vim-Verfahren mit Reptyr zurückbekommen, so dass es genauso funktionierte wie das nicht missbilligte Dienstprogramm, nach dem ich gesucht habe.
hlovdal
Sie haben Recht, @hlovdal: Diese Antwort ist zur Hälfte falsch. reptyrist die Lösung, aber es besteht keine Notwendigkeit, die Verwendung zu beenden disown. Zur Klarheit habe ich eine neue Antwort geschrieben.
Christian Pietsch
11

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
Christian Pietsch
quelle
2
(sudo apt-get install reptyr) Beim ersten Versuch habe ich Folgendes erhalten: "Der Kernel hat beim Anhängen die Berechtigung verweigert. Wenn Ihre UID mit der des Ziels übereinstimmt, überprüfen Sie den Wert von / proc / sys / kernel / yama / ptrace_scope. Weitere Informationen finden Sie unter /etc/sysctl.d/10-ptrace.conf "Ich habe den Wert an beiden Stellen von 1 auf 0 geändert und es hat funktioniert. Ich habe ein Disown und Reptyr eines Prozesses mit demselben Benutzer getestet (ipython notebook auf Ubuntu 14.04 LTS). Vielleicht ist dies für die Entwicklung in einer isolierten Umgebung in Ordnung ... ich bin mir jedoch nicht sicher, welche Auswirkungen die Änderung auf die Sicherheit hat. Vielleicht kann sich jemand mit Fachwissen
melden
1

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, jobdirsund jobtextassoziative 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 SIGSTOPund SIGCONTan den nicht genehmigten Prozess, um Ctrl+ Zund zu simulieren bg. Nichts davon wird so bequem sein wie das Wiederbesitzen.

Gilles 'SO - hör auf böse zu sein'
quelle
0

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.

Scott
quelle
6
Die Umstände sind: Sie verleugnen den falschen Prozess und möchten ihn zurückerhalten.
Nisc
1
Ah. Schwerer. Der Bildschirm muss vorher geplant werden.
Scott