web-dev-qa-db-fra.com

Pourquoi utiliser "Nohup &" plutôt que "exec &"

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?

67
loxaxs

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.

18
Ani Menon

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

2
user2660420

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.

2
HBruijn