web-dev-qa-db-fra.com

Quitter zsh, mais laisser les travaux en cours ouverts?

Je viens de passer de bash à zsh.

Dans bash, les tâches en arrière-plan continuent de s'exécuter à la fermeture du shell. Par exemple ici, dolphin continue de fonctionner après le 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 consiste à avertir de l'exécution de travaux sur exit, puis à les fermer si vous exit à nouveau. Par exemple ici, dolphin est fermé lorsque la deuxième commande exit- quitte réellement le shell:

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

Comment puis-je faire le comportement par défaut de zsh ici comme bash?

69
Owen_R

Démarrez le programme avec &!:

dolphin &!

Le &! ( ou équivalent, &| ) est un raccourci spécifique à zsh à la fois arrière-plan et désavoué le processus, de telle sorte que quitter le Shell le laissera fonctionner.

111
Anko

De la documentation zsh :

HUP

... Dans zsh, si vous avez un travail en arrière-plan en cours d'exécution à la fin du shell, le shell supposera que vous voulez qu'il soit tué; dans ce cas, il est envoyé un signal particulier appelé SIGHUP... Si vous démarrez souvent des travaux qui doivent continuer même après la fermeture du shell, vous pouvez définir l'option NO_HUP, et les travaux en arrière-plan seront laissés seuls.

Il suffit donc de définir le NO_HUP option:

% setopt NO_HUP
54
Carl Norum

J'ai constaté qu'en utilisant une combinaison de Nohup, &, et disown fonctionne pour moi, car je ne veux pas provoquer l'exécution permanente des travaux lorsque le shell est terminé.

Nohup <command> & disown

Alors que & a fonctionné pour moi dans bash, j'ai trouvé en n'utilisant que Nohup, &, ou disown sur les commandes en cours d'exécution, comme un script qui appelle une commande Java run, le processus s'arrête quand le Shell est fermé.

  • Nohup fait ignorer à la commande les signaux Nohup et SIGHUP du Shell
  • & fait fonctionner le processus en arrière-plan dans un sous-terminal
  • disown suivi d'un argument (l'index du numéro de travail dans votre liste de travaux) empêche le shell d'envoyer un signal SIGHUP aux processus enfants. L'utilisation de disown sans argument la fait revenir par défaut au travail le plus récent.

J'ai trouvé les informations Nohup et disown sur cette page , et les & informations dans this SO answer .

23
ryanjdillon

J'utilise généralement screen pour continuer à exécuter les tâches d'arrière-plan.

1) Créez une session écran:

screen -S myScreenName

2) Lancez vos scripts, services, démons ou quoi que ce soit

) Quitter (détacher) la session écran avec

screen -d

ou raccourci ALT+A then d


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

screen -r myScreenName

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

screen -ls

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

1
Aydin K.