Ist es möglich, einen Prozess zur Jobliste in bash hinzuzufügen (z. B. um "disown" umzukehren)?

7

Kann ich es irgendwie rückgängig machen, wenn ich disowneinen Job habe bashund meine Meinung ändere?

Wenn ja, ist es möglich, einen beliebigen Prozess unter Jobkontrolle zu bringen (eine akzeptable Einschränkung wäre, dass ich den Prozess besitze)?

Und schließlich würde dies den folgenden Workflow ermöglichen:

  • Job in den Hintergrund stellen ( ^zgefolgt von bg)
  • Holen Sie sich seine PID ( jobs -p %+um seine zu bekommen <pid>)
  • Öffnen Sie eine screenoder tmuxSitzung, hängen Sie sie an und verwenden Sie sie für die folgenden Schritte
  • Verwenden Sie reptyr, um den Job zu ergreifen ( reptyr <pid>)
  • <pid>zur Jobsteuerung der Shell hinzufügen ( ist das überhaupt möglich? )
  • beende den Job ( ^Z)

Ich kann alles außer den letzten beiden Schritten tun. Das Stoppen des Jobs mit ^Zfunktioniert nicht, da der Prozess nicht in der Jobliste der Shell enthalten ist.

Meine Forschung zeigt, dass es nicht möglich ist, eine PID zu besitzen (umzukehren disown), aber hoffentlich irre ich mich ...

Sternenhimmel
quelle
2
Sie können den Job nicht besitzen, aber wenn Sie den Job beenden möchten, können Sie ihm SIGSTOPper killBefehl ein Signal senden .
Jimmyij
In der Spezifikation heißt es : Wenn Sie bgeinen Job in den Hintergrund stellen, wird seine Prozess-ID "in der aktuellen Shell-Ausführungsumgebung bekannt" , als wäre er als asynchrone Liste gestartet worden . Siehe Asynchrone Listen . Aber auf jeden Fall sollten Sie, wenn Sie so weit gehen und sich hauptsächlich auf Linux zu konzentrieren scheinen, wahrscheinlich nur mit Namespaces arbeiten .
Mikeserv
Fwiw Ich stimme jimmij zu. Ich denke, Sie haben es ein bisschen überlegt.
Bratchley
@Bratchley nicht sicher, wie Sie sagen können, dass ich etwas überdenke . Es geht nicht darum, einen Job überhaupt beenden zu können. Es geht darum, einen Prozess "in der aktuellen Shell-Ausführungsumgebung bekannt zu machen ", wie @mikeserv sagt; Es geht darum, ein Loch in sein Wissen füllen zu wollen. Es geht darum, meine Überzeugung zu bestätigen, da @jimmij zustimmt, dass dies nicht möglich ist. In der Lage zu tun , ^Zwar nur ein Beispiel für etwas , das nicht möglich ist , ohne das es im Besitz von dem Shell. Ich glaube nicht, dass Ihr Kommentar der Frage einen Mehrwert verleiht.
starfry
Die Frage enthielt nichts, was darauf hindeutete, dass dies rein akademisch war. Es ist eine dumme Sache, sich Sorgen zu machen, dass man sowieso nicht dazu in der Lage ist.
Bratchley

Antworten:

3

Im Allgemeinen ist es einer Shell nicht möglich, einen Job zu „übernehmen“. Für eine Shell bedeutet ein Job ein paar Dinge:

  • Verknüpfen Sie eine Job-ID mit einer Prozess-ID.
  • Zeigt seinen Status an (laufend, ausgesetzt, tot).
  • Benachrichtigen Sie den Benutzer, wenn sich der Status ändert.
  • Senden Sie ein SIGHUP-Signal, wenn das Terminal nicht mehr funktioniert.
  • Steuern Sie, ob der Job das Terminal „besitzt“ (ob es sich um die Vordergrundprozessgruppe handelt).

Die meisten davon erfordern keine spezielle Zuordnung zwischen der Shell und dem Job, aber es gibt einige, die dies tun:

  • Um den Benutzer zu benachrichtigen, wenn sich der Status ändert, ist die Shell auf den Empfang eines SIGCLD-Signals angewiesen . Dieses Signal wird vom Kernel an den übergeordneten Prozess des anfänglichen Prozesses des Jobs gesendet.
  • Um den Zugriff auf das Terminal zu steuern, muss sich die Shell in derselben Sitzung wie der Job befinden.

Es ist einem Prozess nicht möglich, einen anderen Prozess zu übernehmen oder einen Prozess an eine vorhandene Sitzung anzuhängen. Um die Übernahme zu unterstützen, müsste die Shell einen Teilstatus verwalten. Die üblichen Shells haben dies nicht implementiert.

In dem speziellen Fall, in dem der Job ursprünglich von dieser Shell gestartet und dann abgelehnt wurde, treten diese Probleme nicht auf. Keine der üblichen Shells hat jedoch eine Ausnahme von der Ausnahme implementiert, mit der sie einen Job hinzufügen können, wenn sie ihn ursprünglich gestartet haben.

In Ihrem Szenario ist es normalerweise am bequemsten, den Job in einer Bildschirm- oder tmux-Sitzung zu starten und die PID zu verwenden, wenn Sie ihn anhalten oder fortsetzen möchten.

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