Comment utiliser la commande nohup sans obtenir nohup.out?
309
J'ai un problème avec la commande nohup.
Lorsque j'exécute mon travail, j'ai beaucoup de données. La sortie nohup.out devient trop volumineuse et mon processus ralentit. Comment puis-je exécuter cette commande sans obtenir nohup.out?
La nohupcommande n'écrit que nohup.outsi la sortie irait autrement au terminal. Si vous avez redirigé la sortie de la commande ailleurs - y compris /dev/null- c'est là que ça va à la place.
Si vous utilisez nohup, cela signifie probablement que vous souhaitez exécuter la commande en arrière-plan en en mettant une autre &à la fin de l'ensemble:
nohup command >/dev/null 2>&1 & # runs in background, still doesn't create nohup.out
Sous Linux, l'exécution d'un travail avec nohupferme automatiquement son entrée également. Sur d'autres systèmes, notamment BSD et macOS, ce n'est pas le cas, donc lors de l'exécution en arrière-plan, vous voudrez peut-être fermer manuellement l'entrée. Bien que la fermeture de l'entrée n'ait aucun effet sur la création ou non de nohup.out, cela évite un autre problème: si un processus d'arrière-plan essaie de lire quoi que ce soit à partir de l'entrée standard, il s'arrêtera, vous attendant de le ramener au premier plan et de taper quelque chose. Ainsi, la version extra-sûre ressemble à ceci:
Notez cependant que cela n'empêche pas la commande d'accéder directement au terminal, ni de le supprimer du groupe de processus de votre shell. Si vous souhaitez effectuer cette dernière opération et que vous exécutez bash, ksh ou zsh, vous pouvez le faire en exécutant disownsans argument comme commande suivante. Cela signifie que le processus d'arrière-plan n'est plus associé à un «travail» de shell et qu'aucun signal ne lui sera transmis depuis le shell. (Notez la distinction: un disownprocessus ed ne reçoit aucun signal qui lui est transmis automatiquement par son shell parent - mais sans nohup, il recevra toujours un HUPsignal envoyé par d'autres moyens, comme une killcommande manuelle . Un nohupprocessus ed ignore tous les HUPsignaux, peu importe comment ils sont envoyés.)
Explication:
Dans les systèmes Unixy, chaque source d'entrée ou cible de sortie est associée à un numéro appelé "descripteur de fichier", ou "fd" pour faire court. Chaque programme en cours d'exécution ("processus") a son propre ensemble de ceux-ci, et lorsqu'un nouveau processus démarre, trois d'entre eux sont déjà ouverts: "l'entrée standard", qui est fd 0, est ouverte pour la lecture du processus, tandis que "sortie standard" (fd 1) et "erreur standard" (fd 2) sont ouverts pour l'écriture. Si vous exécutez simplement une commande dans une fenêtre de terminal, par défaut, tout ce que vous tapez va à son entrée standard, tandis que sa sortie standard et son erreur standard sont envoyées à cette fenêtre.
Mais vous pouvez demander au shell de changer où certains ou tous ces descripteurs de fichiers pointent avant de lancer la commande; c'est ce que la redirection ( <, <<, >, >>) et la conduite ( |opérateurs) font.
Le tuyau est le plus simple de ceux-ci ... command1 | command2dispose que la sortie standard de command1alimente directement l'entrée standard de command2. Il s'agit d'un arrangement très pratique qui a conduit à un modèle de conception particulier dans les outils UNIX (et explique l'existence d'une erreur standard, qui permet à un programme d'envoyer des messages à l'utilisateur même si sa sortie va dans le programme suivant dans le pipeline) . Mais vous ne pouvez diriger que la sortie standard vers l'entrée standard; vous ne pouvez pas envoyer d'autres descripteurs de fichiers à un tuyau sans jongler.
Les opérateurs de redirection sont plus conviviaux dans la mesure où ils vous permettent de spécifier le descripteur de fichier à rediriger. 0<infileLit donc l'entrée standard du fichier nommé infile, tout en 2>>logfileajoutant l'erreur standard à la fin du fichier nommé logfile. Si vous ne spécifiez pas de nombre, la redirection d'entrée par défaut est fd 0 ( <identique à 0<), tandis que la redirection de sortie par défaut est fd 1 ( >identique à 1>).
En outre, vous pouvez combiner les descripteurs de fichiers ensemble: 2>&1signifie "envoyer une erreur standard partout où la sortie standard va". Cela signifie que vous obtenez un seul flux de sortie qui inclut à la fois la sortie standard et l'erreur standard mélangée sans aucun moyen de les séparer, mais cela signifie également que vous pouvez inclure l'erreur standard dans un tube.
Ainsi, la séquence >/dev/null 2>&1signifie "envoyer une sortie standard vers /dev/null" (qui est un périphérique spécial qui jette tout ce que vous y écrivez) "", puis envoyer une erreur standard là où la sortie standard va "(ce que nous venons de vérifier /dev/null). Fondamentalement, "jetez tout ce que cette commande écrit dans l'un ou l'autre descripteur de fichier".
Lorsque nohupdétecte que ni son erreur standard ni sa sortie ne sont attachées à un terminal, il ne prend pas la peine de créer nohup.out, mais suppose que la sortie est déjà redirigée là où l'utilisateur veut qu'elle aille.
L' /dev/nullappareil fonctionne également pour l'entrée; si vous exécutez une commande avec </dev/null, alors toute tentative par cette commande de lire à partir de l'entrée standard rencontrera instantanément la fin du fichier. Notez que la syntaxe de fusion n'aura pas le même effet ici; cela ne fonctionne que pour pointer un descripteur de fichier vers un autre qui est ouvert dans la même direction (entrée ou sortie). Le shell vous laisse faire >/dev/null <&1, mais cela finit par créer un processus avec un descripteur de fichier d'entrée ouvert sur un flux de sortie, donc au lieu de simplement appuyer sur la fin du fichier, toute tentative de lecture déclenchera une erreur fatale de "descripteur de fichier invalide".
@Tim - cette réponse est correcte pour Linux, mais pas pour BSD ou OS X, sur lequel nohupne ferme pas automatiquement l'entrée standard. Notez que ce nohupn'est pas un shell intégré mais un utilitaire binaire.
Mark Reed
nohup fait partie de coreutils. Voulez-vous dire la mise en œuvre denohup est différente pour Linux et pour BSD ou OS X?
Tim
Oui. Le nom "coreutils" fait référence à un paquet GNU. Mais BSD, OS X, SmartOS / Illumos et de nombreux Unix commerciaux - essentiellement ceux qui existent depuis plus longtemps que GNU - ont des utilitaires de base non GNU. awkest différent, sedest différent,nohup est différent ...
Cela ne devrait-il pas être >/ dev / null plutôt que </ dev / null?
Scott Chu
3
@ScottChu < /dev/nullredirige l'entrée standard pour nohup. Linux ne l'exige pas mais POSIX permet un comportement qui nohupne peut pas s'exécuter en arrière-plan si son entrée standard est connectée au terminal. Des exemples de tels systèmes sont BSD et OS X.
Mikko Rantalainen
8
Vous voudrez peut-être utiliser le programme de détachement . Vous l'utilisez comme nohupmais il ne produit pas de journal de sortie sauf si vous le lui demandez. Voici la page de manuel:
NAME
detach - run a command after detaching from the terminal
SYNOPSIS
detach [options] [--] command [args]
Forks a new process, detaches is from the terminal, and executes com‐
mand with the specified arguments.
OPTIONS
detach recognizes a couple of options, which are discussed below. The
special option -- is used to signal that the rest of the arguments are
the command and args to be passed to it.
-e file
Connect file to the standard error of the command.
-f Run in the foreground (do not fork).
-i file
Connect file to the standard input of the command.
-o file
Connect file to the standard output of the command.
-p file
Write the pid of the detached process to file.
EXAMPLE
detach xterm
Start an xterm that will not be closed when the current shell exits.
AUTHOR
detach was written by Robbert Haarman. See http://inglorion.net/ for
contact information.
Remarque Je n'ai aucune affiliation avec l'auteur du programme. Je ne suis qu'un utilisateur satisfait du programme.
Réponses:
La
nohup
commande n'écrit quenohup.out
si la sortie irait autrement au terminal. Si vous avez redirigé la sortie de la commande ailleurs - y compris/dev/null
- c'est là que ça va à la place.Si vous utilisez
nohup
, cela signifie probablement que vous souhaitez exécuter la commande en arrière-plan en en mettant une autre&
à la fin de l'ensemble:Sous Linux, l'exécution d'un travail avec
nohup
ferme automatiquement son entrée également. Sur d'autres systèmes, notamment BSD et macOS, ce n'est pas le cas, donc lors de l'exécution en arrière-plan, vous voudrez peut-être fermer manuellement l'entrée. Bien que la fermeture de l'entrée n'ait aucun effet sur la création ou non denohup.out
, cela évite un autre problème: si un processus d'arrière-plan essaie de lire quoi que ce soit à partir de l'entrée standard, il s'arrêtera, vous attendant de le ramener au premier plan et de taper quelque chose. Ainsi, la version extra-sûre ressemble à ceci:Notez cependant que cela n'empêche pas la commande d'accéder directement au terminal, ni de le supprimer du groupe de processus de votre shell. Si vous souhaitez effectuer cette dernière opération et que vous exécutez bash, ksh ou zsh, vous pouvez le faire en exécutant
disown
sans argument comme commande suivante. Cela signifie que le processus d'arrière-plan n'est plus associé à un «travail» de shell et qu'aucun signal ne lui sera transmis depuis le shell. (Notez la distinction: undisown
processus ed ne reçoit aucun signal qui lui est transmis automatiquement par son shell parent - mais sansnohup
, il recevra toujours unHUP
signal envoyé par d'autres moyens, comme unekill
commande manuelle . Unnohup
processus ed ignore tous lesHUP
signaux, peu importe comment ils sont envoyés.)Explication:
Dans les systèmes Unixy, chaque source d'entrée ou cible de sortie est associée à un numéro appelé "descripteur de fichier", ou "fd" pour faire court. Chaque programme en cours d'exécution ("processus") a son propre ensemble de ceux-ci, et lorsqu'un nouveau processus démarre, trois d'entre eux sont déjà ouverts: "l'entrée standard", qui est fd 0, est ouverte pour la lecture du processus, tandis que "sortie standard" (fd 1) et "erreur standard" (fd 2) sont ouverts pour l'écriture. Si vous exécutez simplement une commande dans une fenêtre de terminal, par défaut, tout ce que vous tapez va à son entrée standard, tandis que sa sortie standard et son erreur standard sont envoyées à cette fenêtre.
Mais vous pouvez demander au shell de changer où certains ou tous ces descripteurs de fichiers pointent avant de lancer la commande; c'est ce que la redirection (
<
,<<
,>
,>>
) et la conduite (|
opérateurs) font.Le tuyau est le plus simple de ceux-ci ...
command1 | command2
dispose que la sortie standard decommand1
alimente directement l'entrée standard decommand2
. Il s'agit d'un arrangement très pratique qui a conduit à un modèle de conception particulier dans les outils UNIX (et explique l'existence d'une erreur standard, qui permet à un programme d'envoyer des messages à l'utilisateur même si sa sortie va dans le programme suivant dans le pipeline) . Mais vous ne pouvez diriger que la sortie standard vers l'entrée standard; vous ne pouvez pas envoyer d'autres descripteurs de fichiers à un tuyau sans jongler.Les opérateurs de redirection sont plus conviviaux dans la mesure où ils vous permettent de spécifier le descripteur de fichier à rediriger.
0<infile
Lit donc l'entrée standard du fichier nomméinfile
, tout en2>>logfile
ajoutant l'erreur standard à la fin du fichier nommélogfile
. Si vous ne spécifiez pas de nombre, la redirection d'entrée par défaut est fd 0 (<
identique à0<
), tandis que la redirection de sortie par défaut est fd 1 (>
identique à1>
).En outre, vous pouvez combiner les descripteurs de fichiers ensemble:
2>&1
signifie "envoyer une erreur standard partout où la sortie standard va". Cela signifie que vous obtenez un seul flux de sortie qui inclut à la fois la sortie standard et l'erreur standard mélangée sans aucun moyen de les séparer, mais cela signifie également que vous pouvez inclure l'erreur standard dans un tube.Ainsi, la séquence
>/dev/null 2>&1
signifie "envoyer une sortie standard vers/dev/null
" (qui est un périphérique spécial qui jette tout ce que vous y écrivez) "", puis envoyer une erreur standard là où la sortie standard va "(ce que nous venons de vérifier/dev/null
). Fondamentalement, "jetez tout ce que cette commande écrit dans l'un ou l'autre descripteur de fichier".Lorsque
nohup
détecte que ni son erreur standard ni sa sortie ne sont attachées à un terminal, il ne prend pas la peine de créernohup.out
, mais suppose que la sortie est déjà redirigée là où l'utilisateur veut qu'elle aille.L'
/dev/null
appareil fonctionne également pour l'entrée; si vous exécutez une commande avec</dev/null
, alors toute tentative par cette commande de lire à partir de l'entrée standard rencontrera instantanément la fin du fichier. Notez que la syntaxe de fusion n'aura pas le même effet ici; cela ne fonctionne que pour pointer un descripteur de fichier vers un autre qui est ouvert dans la même direction (entrée ou sortie). Le shell vous laisse faire>/dev/null <&1
, mais cela finit par créer un processus avec un descripteur de fichier d'entrée ouvert sur un flux de sortie, donc au lieu de simplement appuyer sur la fin du fichier, toute tentative de lecture déclenchera une erreur fatale de "descripteur de fichier invalide".la source
nohup
, "si le processus essaye plus tard de lire quoi que ce soit à partir de l'entrée standard, il s'arrêtera, en attendant que vous le remettiez au premier plan et que vous tapiez quelque chose." semble incorrect. Au lieu de cela,nohup
ferme l'entrée standard (le programme ne pourra lire aucune entrée, même s'il est exécuté au premier plan. Il n'est pas arrêté, mais recevra un code d'erreur ou EOF).nohup
ne ferme pas automatiquement l'entrée standard. Notez que cenohup
n'est pas un shell intégré mais un utilitaire binaire.nohup
est différente pour Linux et pour BSD ou OS X?awk
est différent,sed
est différent,nohup
est différent ...</dev/null
? Voir également0>/dev/null
unix.stackexchange.com/a/266247C'est tout ce que vous devez faire!
la source
&
sur le vous empêchera d'avoir besoin d'utiliserctrl-c
, si cela vous intéresse.some_command
sortie, y compris l'erreur.Avez-vous essayé de rediriger les trois flux d'E / S:
la source
>
/ dev / null plutôt que </ dev / null?< /dev/null
redirige l'entrée standard pournohup
. Linux ne l'exige pas mais POSIX permet un comportement quinohup
ne peut pas s'exécuter en arrière-plan si son entrée standard est connectée au terminal. Des exemples de tels systèmes sont BSD et OS X.Vous voudrez peut-être utiliser le programme de détachement . Vous l'utilisez comme
nohup
mais il ne produit pas de journal de sortie sauf si vous le lui demandez. Voici la page de manuel:Remarque Je n'ai aucune affiliation avec l'auteur du programme. Je ne suis qu'un utilisateur satisfait du programme.
la source
La commande suivante vous permettra d'exécuter quelque chose en arrière-plan sans obtenir nohup.out:
De cette façon, vous pourrez obtenir la sortie de la console tout en exécutant le script sur le serveur distant:
la source
La redirection de la sortie de sudo fait que sudo recherche le mot de passe, donc un mécanisme maladroit est nécessaire pour faire cette variante.
la source
Si vous avez un shell BASH sur votre mac / linux devant vous, vous essayez les étapes ci-dessous pour comprendre la redirection pratiquement:
Créez un script de 2 lignes appelé zz.sh
Actuellement, l'exécution du script envoie simplement STDOUT et STDERR à l'écran.
Commençons maintenant par la redirection standard:
Dans ce qui précède, "echo" (STDOUT) va dans le fichier zfile.txt. Tandis que "erreur" (STDERR) s'affiche à l'écran.
Ce qui précède est le même que:
Vous pouvez maintenant essayer le contraire et rediriger STDERR "error" dans le fichier. La commande STDOUT de "echo" va à l'écran.
En combinant les deux ci-dessus, vous obtenez:
Explication:
Finalement, vous pouvez emballer le tout dans la commande nohup & pour l'exécuter en arrière-plan:
la source
Vous pouvez exécuter la commande ci-dessous.
par exemple, j'ai une commande nohup dans le script
la source