Je sais que Nohup
étant un binaire, il est accessible depuis n'importe quel shell. Mais le exec
intégré existe probablement dans chaque Shell.
Y a-t-il une raison de préférer l'un d'eux à l'autre?
Quoi de mieux, un poisson ou un vélo? Nohup
et exec
font des choses différentes.
exec
remplace le Shell par un autre programme. L'utilisation de exec
dans un travail d'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 à myprogram; more stuff
qui s'exécute more stuff
lorsque myprogram
se termine; mais exec myprogram & more stuff
démarre myprogram
en arrière-plan, puis exécute more stuff
, juste 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 dans ce terminal (c'est-à-dire le Shell). L'environnement Shell envoie à son tour SIGHUP à tous les travaux exécutés en arrière-plan. L'exécution d'un travail avec Nohup
l'empêche d'être tué de cette façon si le terminal meurt (ce qui se produit par exemple si vous avez été connecté à distance et que 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 la mort du programme car il n'est pas en mesure d'écrire sur sa sortie ou sa sortie d'erreur. Notez que Nohup
ne redirige pas l'entrée. Pour déconnecter complètement un programme du terminal sur lequel vous l'avez lancé, utilisez
Nohup myprogram </dev/null >myprogram.log 2>&1 &
exec &
=> exécute un processus en tant que processus d'arrière-plan afin que vous puissiez continuer à utiliser le même terminal pour d'autres travaux.
Nohup
=> évite tout SIGHUP (signal de fin) et continue l'exécution même si votre terminal est fermé.
exec
processus meurt lorsqu'un SIGHUP
est reçu, mais Nohup
processus continue.
Vous ne pouvez pas comparer Nohup
avec exec
. Lorsque vous exécutez un exécutable avec Nohup
, le processus ne sera pas tué lorsque vous vous déconnectez (session ssh); généralement Nohup
est utilisé avec Nice
pour exécuter les processus avec une priorité inférieure. Le signal HUP
est, par convention, la façon dont un terminal avertit les processus dépendants de déconnexion
La commande intégrée de Shell exec <command>
remplace le Shell par <command>
, aucun nouveau processus, aucun nouveau PID n'est créé. Après l'achèvement de <command>
normalement votre terminal fermera. En l'exécutant en arrière-plan, un sous-shell est d'abord créé, qui est ensuite immédiatement remplacé par <command>
.
Le Nohup <command>
la commande s'exécutera <command>
mais immume dans les raccords (kill -s 1) afin qu'il ne soit pas interrompu lorsque le Shell, le terminal à partir duquel il a été démarré, est fermé. En l'exécutant d'abord en arrière-plan, un sous-shell est créé et la commande s'exécute en arrière-plan, vous renvoyant à l'invite.
En script, l'effet immédiat est plus ou moins le même, <command>
est démarré par votre script et le script continuera sans attendre <command>
pour commencer, pour envoyer la sortie ou pour terminer.