it-swarm.com.de

Zsh beenden, aber laufende Jobs offen lassen?

Ich bin gerade von bash auf zsh umgestiegen.

In Bash werden Hintergrundtasks weiterhin ausgeführt, wenn die Shell beendet wird. Zum Beispiel läuft hier dolphin nach dem exit weiter:

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

Dies ist, was ich als Standardverhalten möchte.

Im Gegensatz dazu warnt zsh, dass Jobs auf exit ausgeführt werden, und schließt sie, wenn Sie exit erneut ausführen. Beispielsweise wird hier dolphin geschlossen, wenn der zweite Befehl exit- die Shell tatsächlich beendet:

 % 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?

69
Owen_R

Starten Sie das Programm mit &!:

dolphin &!

Das &! ( oder äquivalent, &| ) ist eine zsh-spezifische Verknüpfung zu background und disown der Prozess, so dass das Beenden der Shell ihn laufen lässt.

111
Anko

Aus der zsh-Dokumentation :

HUP

... Wenn in zsh beim Beenden der Shell ein Hintergrundjob ausgeführt wird, geht die Shell davon aus, dass dieser beendet 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 NO_HUP und Hintergrundjobs werden alleine gelassen.

Stellen Sie also einfach das NO_HUP Möglichkeit:

% setopt NO_HUP
54
Carl Norum

Ich habe festgestellt, dass mit einer Kombination von Nohup, & und disown funktionieren für mich, da ich nicht dauerhaft die Ausführung von Jobs veranlassen möchte, wenn die Shell beendet wurde.

Nohup <command> & disown

Während nur & hat für mich in bash gearbeitet, ich habe gefunden, wenn ich nur Nohup, & oder disown bei der Ausführung von Befehlen, wie z. B. einem Skript, das einen Befehl Java run aufruft, stoppt der Prozess immer noch, wenn die Shell beendet wird.

  • Nohup bewirkt, dass der Befehl die Signale Nohup und SIGHUP von der Shell ignoriert
  • & lässt den Prozess im Hintergrund in einem Subterminal ablaufen
  • disown gefolgt von einem Argument (der Index der Jobnummer in Ihrer Jobliste) verhindert, dass die Shell ein SIGHUP Signal an untergeordnete Prozesse sendet. Wenn Sie disown ohne Argument verwenden, wird standardmäßig der neueste Job verwendet.

Ich fand die Informationen zu Nohup und disown unter diese Seite und die Informationen zu & Informationen in this SO answer .

23
ryanjdillon

Normalerweise verwende ich screen, um Hintergrundjobs laufen zu lassen.

1) Erstellen Sie eine Bildschirmsitzung:

screen -S myScreenName

2) Starten Sie Ihre Skripte, Dienste, Daemons oder was auch immer

) Bildschirm-Sitzung beenden (trennen) mit

screen -d

oder Verknüpfung ALT+A then d


Nach ein paar hundert Jahren - wenn Sie Ihre Sitzung wieder aufnehmen möchten (neu anfügen):

screen -r myScreenName

Wenn Sie wissen möchten, ob eine Bildschirmsitzung vorhanden ist, geben Sie den Namen und den Status an (verbunden oder getrennt):

screen -ls

Diese Lösung funktioniert auf allen Terminalinterpretern wie bash, zsh usw. Siehe auch man screen

1
Aydin K.