Zsh beenden, aber laufende Jobs offen lassen?

90

Einfach von Bash auf Zsh umgestellt.

In Bash werden Hintergrundaufgaben weiterhin ausgeführt, wenn die Shell beendet wird. Zum Beispiel dolphinläuft hier weiter nach exit:

$ dolphin .
^Z
[1]+  Stopped                 dolphin .
$ bg
[1]+ dolphin . &
$ exit

Dies ist, was ich als Standardverhalten möchte.

Im Gegensatz dazu warnt zsh davor, Jobs auszuführen exit, und schließt sie dann, wenn Sie es exiterneut tun. Zum Beispiel wird hier dolphingeschlossen, wenn der zweite exitBefehl die Shell tatsächlich verlässt:

 % dolphin .
^Z
zsh: suspended  dolphin .
 % bg
[1]  + continued  dolphin .
 % exit
zsh: you have running jobs.
 % exit 

Wie mache ich das Standardverhalten von zsh hier wie das von Bash?

Owen_R
quelle

Antworten:

162

Starten Sie das Programm mit &!:

dolphin &!

Das &!( oder gleichwertig&| ) ist eine zsh-spezifische Verknüpfung sowohl zum Hintergrund als auch zum Ablehnen des Prozesses, sodass das Verlassen der Shell ausgeführt wird.

Anko
quelle
1
Können Sie der Vollständigkeit halber auch auflisten, wie Sie es ablehnen können, wenn es bereits gestartet ist?
Trusktr
@trusktr Es gibt eine andere Frage zum Ablehnen des Vordergrundprozesses . Ich denke, es wird aus Gründen der Klarheit am besten getrennt gehalten. Für alle, die sich speziell für zsh interessieren, habe ich bei U & L SE eine Frage gestellt, wie ein schnellerer Workflow zum Ablehnen des Vordergrundprozesses erstellt werden kann .
Anko
59

Aus der zsh-Dokumentation :

HUP

... Wenn in zsh beim Beenden der Shell ein Hintergrundjob ausgeführt wird, geht die Shell davon aus, dass dieser getötet werden soll. In diesem Fall wird ein bestimmtes Signal mit dem Namen SIGHUP... gesendet. Wenn Sie häufig Jobs starten, die auch nach dem Beenden der Shell fortgesetzt werden sollen, können Sie die Option festlegen NO_HUP, und Hintergrundjobs werden in Ruhe gelassen.

Stellen Sie einfach die NO_HUPOption ein:

% setopt NO_HUP
Carl Norum
quelle
Wenn Sie die Warnung nicht möchten, ja.
Carl Norum
28

Ich habe festgestellt, dass die Verwendung einer Kombination aus nohup, &und disownfür mich funktioniert, da ich nicht dauerhaft dazu führen möchte, dass Jobs ausgeführt werden, wenn die Shell beendet wird.

nohup <command> & disown

Während nur & ich gerade in gearbeitet habe bash, habe ich festgestellt nohup, dass der Prozess beim Beenden der Shell immer noch angehalten wird, wenn ich nur Befehle verwende &oder disownBefehle wie ein Skript ausführe, das einen Java-Ausführungsbefehl aufruft.

  • nohupLässt den Befehl ignorieren NOHUPund SIGHUPsignalisiert von der Shell
  • & Lässt den Prozess im Hintergrund in einem Subterminal laufen
  • disown gefolgt von einem Argument (dem Index der Jobnummer in Ihrer Jobliste) verhindert, dass die Shell a sendet SIGHUP Signal an untergeordnete Prozesse . Wenn Sie disownohne Argument verwenden, wird standardmäßig der neueste Job verwendet.

Ich habe die nohupund disownInformationen auf dieser Seite und die &Informationen in dieser SO-Antwort gefunden .

Ryanjdillon
quelle
4

Ich verwende normalerweise, screenum Hintergrundjobs am Laufen zu halten.

1) Erstellen Sie eine Bildschirmsitzung:

screen -S myScreenName

2) Starten Sie Ihre Skripte, Dienste, Dämonen oder was auch immer

3) Beenden Sie die Bildschirmsitzung mit

screen -d

oder Verknüpfung ALT+A then d


Nach einigen hundert Jahren - wenn Sie Ihre Sitzung fortsetzen möchten (erneut anbringen):

screen -r myScreenName

Wenn Sie wissen möchten, ob es eine Bildschirmsitzung gibt, ihren Namen und ihren Status (angehängt oder getrennt):

screen -ls

Diese Lösung funktioniert auf allen Terminal-Interpreten wie Bash, Zsh usw. Siehe auch man screen

Aydin K.
quelle
Ein Hinweis für MacOS-Benutzer: Die Tastenkombination zum Trennen vom Bildschirm war Strg + A und dann D. Dies war auch meine einzige Option, als ich einen Prozess laufen ließ und dem Standard nachgab. Das Schreiben von Bildschirm -d dort würde nicht helfen.
Bishoy