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?
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.
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'optionNO_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
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-terminaldisown
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 .
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