Je sais que, nohup
étant un binaire, il est accessible depuis n’importe quel shell. Mais la fonction exec
intégrée existe probablement dans chaque shell.
Y a-t-il une raison de préférer l'une d'elles à l'autre?
Quoi de mieux, un poisson ou un vélo? nohup
et exec
faire des choses différentes.
exec
remplace le shell par un autre programme. L'utilisation exec
dans un travail en arrière-plan simple n'est pas utile: exec myprogram; more stuff
remplace le shell par myprogram
et ne s'exécute donc pas more stuff
, contrairement à celui myprogram; more stuff
qui s'exécute more stuff
quand se myprogram
termine; mais exec myprogram & more stuff
commence myprogram
en arrière-plan et s'exécute more stuff
, tout comme myprogram & more stuff
.
nohup
exécute le programme spécifique avec le signal SIGHUP ignoré. Lorsqu'un terminal est fermé, le noyau envoie SIGHUP au processus de contrôle de ce terminal (c'est-à-dire le shell). Le shell à son tour envoie SIGHUP à tous les travaux exécutés en arrière-plan. L'exécution d'un travail avec nohup
empêche celui-ci d'être tué de cette manière si le terminal meurt (ce qui se produit par exemple si vous étiez connecté à distance et si la connexion est interrompue ou si vous fermez votre émulateur de terminal).
nohup
redirige également la sortie du programme vers le fichier nohup.out
. Cela évite que le programme ne meure car il n'est pas en mesure d'écrire sur sa sortie ou sur une sortie d'erreur. Notez que nohup
cela ne redirige pas l'entrée. Pour déconnecter complètement un programme du terminal où vous l'avez lancé, utilisez
nohup myprogram </dev/null >myprogram.log 2>&1 &
exec firefox
le shell, celui-ci n'est plus en cours d'exécution: il a été remplacé parfirefox
. Vous pouvez envisager deexec
combiner la sortie d'un programme et le démarrage d'un nouveau programme, tout en conservant le même ID de processus. Le terminal continue à fonctionner car rien ne lui dit de s’arrêter. Lorsque vous quittez Firefox par la suite, lefirefox
processus se termine. Le terminal remarque que son processus enfant est terminé et qu'il le quitte à son tour.exec &
=> exécute un processus en arrière-plan afin que vous puissiez continuer à utiliser le même terminal pour d'autres tâches.nohup
=> évite tout SIGHUP (signal de fin) et continue l'exécution même si votre terminal est fermé.exec
le processus meurt quand aSIGHUP
est reçu, mais lenohup
processus continue.la source
exec
remplace normalement le processus en cours d'exécution, mais cela ne semble pas se produire lorsque vous utilisez&
en arrière-plan la commande exec'd. Ni en bash ni zsh.exec smth &
est-ce la même chose(exec smth) &
, n'est-ce pas ce qui se passe?(exec smth) &
. Mais je ne m'attendrais pas à ce qu'il en soit de même - je m'attendrais à une erreur de syntaxe. Comment pouvez-vous exécuter un processus (en le remplaçant) puis en arrière-plan du processus exécuté? Vous n'êtes plus là pour le faire.La commande intégrée
exec <command>
du shell remplace le shell par<command>
aucun nouveau processus, aucun nouveau PID n'est créé. Après l'achèvement de<command>
normalement votre terminal sera fermé. En l'exécutant en arrière-plan, un sous-shell est créé, qui est immédiatement remplacé par celui-ci<command>
.La
nohup <command>
commande sera exécutée<command>
mais immume pour raccrocher (kill -s 1) afin qu'elle ne soit pas terminée lorsque le shell, le terminal à partir duquel elle a été démarrée, est fermé. En l'exécutant en arrière-plan, un sous-shell est créé et la commande s'exécute en arrière-plan, ce qui vous ramène à l'invite.Dans le script, l'effet immédiat est plus ou moins le même, cependant, il
<command>
est démarré par votre script et le script se poursuivra sans attendre<command>
de démarrer, d'envoyer une sortie ou de se terminer.la source
script.sh &
ouexec script.sh &
. Dans les deux cas, la commande est exécutée dans un processus enfant, elle ne remplace pas le processus d'appel, voir: paste.alacon.org/44474 (trop long pour la copier ici dans un commentaire…). Qu'est-ce que je fais mal?Vous ne pouvez pas comparer
nohup
avecexec
. Lorsque vous exécutez un exécutable avecnohup
, le processus ne sera pas tué lorsque vous vous déconnecterez (session ssh);nohup
est généralement utilisé avecnice
pour exécuter des processus avec une priorité inférieure. LeHUP
signal est, par convention, la façon dont un terminal met en garde les processus dépendants de la déconnexionla source