139 votes

Fermez zsh, mais laissez les tâches en cours ouvertes?

Je viens de passer de bash à zsh.

Sous bash, les tâches en arrière-plan continuent de s'exécuter lorsque le shell se ferme. Par exemple ici, dolphin continue de s'exécuter après la commande exit :

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

C'est ce que je veux comme comportement par défaut.

En revanche, le comportement de zsh est d'avertir des tâches en cours à la sortie, puis de les fermer si vous quittez de nouveau le shell. Par exemple ici, dolphin est fermé lorsque la deuxième commande exit fait réellement sortir le shell :

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

Comment puis-je faire en sorte que le comportement par défaut de zsh soit similaire à celui de bash ici ?

243voto

Anko Points 3139

Commencez le programme avec &!:

dolphin &!

Le &! (ou de manière équivalente, &|) est un raccourci spécifique à zsh pour à la fois mettre en arrière-plan et détacher le processus, de sorte que le quitter le shell le laissera tourner.

67voto

Carl Norum Points 114072

Depuis la documentation zsh :

HUP

... Dans zsh, si vous avez un travail en arrière-plan en cours d'exécution lorsque le shell se termine, le shell supposera que vous voulez que celui-ci soit arrêté ; dans ce cas, il est envoyé un signal particulier appelé SIGHUP... Si vous démarrez souvent des tâches qui doivent se poursuivre même lorsque le shell a été quitté, vous pouvez définir l'option NO_HUP, et les tâches en arrière-plan seront laissées intactes.

Il suffit donc de définir l'option NO_HUP :

% setopt NO_HUP

43voto

shootingstars Points 774

J'ai trouvé que l'utilisation d'une combinaison de nohup, & et disown fonctionne pour moi, car je ne veux pas provoquer de manière permanente l'exécution de tâches lorsque le shell est sorti.

nohup  & disown

Alors que juste & a fonctionné pour moi dans bash, j'ai constaté que lorsque j'utilise uniquement nohup, & ou disown sur des commandes en cours d'exécution, comme un script qui appelle une commande de lancement java, le processus s'arrête toujours lorsque le shell est sorti.

  • nohup permet à la commande d'ignorer les signaux NOHUP et SIGHUP du shell
  • & permet d'exécuter le processus en arrière-plan dans un sous-terminal
  • disown suivi d'un argument (l'indice du numéro de tâche dans votre liste de tâches) empêche le shell d'envoyer un signal SIGHUP aux processus enfants. Utiliser disown sans argument le fait revenir à la tâche la plus récente.

J'ai trouvé les informations sur nohup et disown sur cette page, et les informations sur & dans cette réponse SO.

Mise à jour

Quand j'ai écrit cela à l'origine, je l'utilisais pour des scripts/programmes de traitement de données. Pour ce type d'utilisation, quelque chose comme ts (task-spooler) fonctionne très bien.

9voto

AydinK Points 181

J'utilise généralement screen pour maintenir des tâches en arrière-plan en cours d'exécution.

1) Créer une session screen :

screen -S myScreenName

2) Lancez vos scripts, services, démons ou autre

3) Quittez (détachez) la session screen avec

screen -d

ou raccourci ALT+A puis d


Après quelques centaines d'années - si vous souhaitez reprendre votre session (réattacher):

screen -r myScreenName

Si vous voulez savoir s'il y a une session screen, son nom et son statut (attachée ou détachée):

screen -ls

Cette solution fonctionne sur tous les interpréteurs de terminal comme bash, zsh, etc. Voir aussi man screen

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X