Quitter zsh, mais laisser les emplois en cours d'exécution ouverts?
vient de passer de bash à zsh.
En bash, les tâches de fond continuer à fonctionner lorsque le shell sorties. Par exemple ici, dolphin
continue de courir 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 est de prévenir sur les travaux en cours sur exit
, puis les fermer si vous exit
à nouveau. Par exemple, ici, dolphin
est fermé lorsque le deuxième exit
- commande sort effectivement du shell:
% dolphin .
^Z
zsh: suspended dolphin .
% bg
[1] + continued dolphin .
% exit
zsh: you have running jobs.
% exit
comment rendre le comportement par défaut de zsh ici comme celui de bash?
4 réponses
démarrer le programme avec -
dolphin &!
le &!
( ou équivalent, &|
) est un raccourci spécifique de zsh à la fois background et disown le processus, de sorte que la sortie du shell le laissera en marche.
De la zsh documentation :
HUP
... En zsh, si vous avez une tâche de fond en cours d'exécution lorsque l'interpréteur de commandes sort, l'interpréteur de commandes supposera que vous voulez qu'il soit tué; dans ce cas, il est envoyé un signal particulier appelé
SIGHUP
... Si vous commencez souvent des travaux qui devraient continuer même lorsque le shell est sorti, alors vous pouvez définir l'optionNO_HUP
, et les travaux de fond sera laissé seul.
il suffit donc de définir l'option NO_HUP
:
% setopt NO_HUP
j'ai trouvé que l'utilisation d'une combinaison de nohup
, &
, et disown
fonctionne pour moi, car je ne veux pas faire fonctionner les travaux de façon permanente lorsque le shell a quitté.
nohup <command> & disown
alors que juste &
a fonctionné pour moi dans bash
, j'ai trouvé en utilisant seulement nohup
, &
, ou disown
sur les commandes en cours d'exécution, comme un script qui appelle une commande java run, le processus s'arrêterait quand le shell serait sorti.
-
nohup
fait ignorer la commandeNOHUP
etSIGHUP
les signaux du shell -
&
fait tourner le processus en arrière-plan dans un subterminal -
disown
suivi d'un argument (l'index du numéro de tâche dans votre liste de tâches) empêche le shell d'envoyer un signalSIGHUP
aux processus enfants. L'utilisation dedisown
sans argument lui fait défaut à la emploi le plus récent.
j'ai trouvé les nohup
et disown
informations à cette page , et les &
informations à cette réponse .
j'utilise typiquement screen
pour maintenir les travaux de fond en cours.
1) Créer une session d'écran:
screen -S myScreenName
2) Lancez vos scripts,services, démons ou quoi que ce soit
3) Écran de sortie (detach) - session avec
screen -d
ou
raccourci ALT+A then d
Après quelques centaines d'années - si vous voulez reprendre votre session (rattacher):
screen -r myScreenName
si vous voulez savoir s'il y a une session-Écran, son nom et son statut (joint ou détaché):
screen -ls
Cette solution fonctionne sur tous les interprètes terminaux comme bash, zsh etc.
Voir aussi man screen