Comment puis-je utiliser la commande nohup sans obtenir nohup.out?
J'ai un problème avec la commande nohup.
Quand je dirige mon travail, j'ai beaucoup de données. La sortie nohup.devient trop grand et mon processus ralentit. Comment puis-je exécuter cette commande sans obtenir nohup.out?
8 réponses
Nohup n'écrit dans nohup.out
que si la sortie est dans le terminal. Si vous redirigez la sortie de la commande ailleurs-y compris /dev/null
- c'est là qu'elle va à la place.
nohup command >/dev/null 2>&1 # doesn't create nohup.out
Si vous utilisez nohup
, cela signifie probablement que vous voulez exécuter la commande en arrière-plan en mettant un 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 nohup
ferme également automatiquement son entrée. Sur D'autres systèmes, notamment BSD et OS X, c'est-à-dire ce n'est pas le cas, donc lorsque vous exécutez en arrière-plan, vous pouvez fermer son entrée manuellement. Bien que la fermeture de l'entrée n'ait aucun effet sur la création ou non de nohup.out
, elle é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 fera une pause, en attendant que vous le rameniez au premier plan et tapiez quelque chose. Donc, la version extra-sûre ressemble à ceci:
nohup command </dev/null >/dev/null 2>&1 & # completely detached from terminal
Notez cependant que cela n'empêche pas la commande d'accéder directement au terminal, ni le supprimer de votre coque du processus de groupe. Si vous voulez faire ce dernier, vous pouvez le faire en exécutant disown
sans argument comme commande suivante, à quel point le processus n'est plus associé à un "travail" shell et n'aura aucun signaux (pas seulement HUP
) transmis à partir du shell.
Explication:
Dans les systèmes Unixy, chaque source d'entrée ou cible de sortie a un nombre associé 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 quand un nouveau processus démarre, il en a trois déjà ouverts: "entrée standard", qui est fd 0, est ouvert pour que le processus puisse lire, tandis que "sortie standard" (fd 1) et "erreur standard" (fd 2) sont ouverts pour qu'il puisse écrire. Si vous exécutez simplement une commande dans une fenêtre de terminal, alors par défaut, tout ce que vous tapez va à son entrée standard, tandis que sa sortie standard et l'erreur standard sont envoyées à cette fenêtre.
Mais vous pouvez demandez au shell de changer l'endroit où pointent tout ou partie de ces descripteurs de fichier avant de lancer la commande; c'est ce que la redirection (<
, <<
, >
, >>
) et les opérateurs pipe (|
) font.
Le tuyau est le plus simple d'entre eux... command1 | command2
organise la sortie standard de command1
pour alimenter directement l'entrée standard de command2
. C'est 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 que canaliser la sortie standard vers l'entrée standard; vous ne pouvez pas envoyer d'autres descripteurs de fichier à un tuyau sans jongler.
Les opérateurs de redirection sont plus conviviaux en ce sens qu'ils vous permettent de spécifier le descripteur de fichier à rediriger. Ainsi, 0<infile
lit l'entrée standard du fichier nommé infile
, tandis que 2>>logfile
ajoute 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 ({[11] } est identique à 0<
), tandis que la redirection de sortie par défaut est fd 1 ({[13] } est identique à 1>
).
En outre, vous pouvez combiner des 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 standard out et standard error mélangés sans aucun moyen de les séparer, mais cela signifie également que vous pouvez inclure erreur standard dans un tuyau.
Donc, la séquence >/dev/null 2>&1
signifie " envoyer une sortie standard à /dev/null
"(qui est un périphérique spécial qui jette tout ce que vous écrivez) "puis envoyer une erreur standard à l'endroit où la sortie standard va" (ce que nous venons de faire était /dev/null
). Fondamentalement, "jetez ce que cette commande écrit soit descripteur de fichier".
Lorsque nohup
détecte que ni son erreur standard ni sa sortie ne sont attachées à un terminal, cela ne dérange pas créer nohup.out
, mais suppose que la sortie est déjà redirigé où l'utilisateur souhaite aller.
Le périphérique /dev/null
fonctionne également pour l'entrée; si vous exécutez une commande avec </dev/null
, toute tentative de lecture de cette commande à partir d'une 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). La coquille vous permettra de faire >/dev/null <&1
, mais que les vents créer un processus avec un descripteur de fichier d'entrée ouvert sur un flux de sortie, Donc au lieu de simplement frapper la fin du fichier, toute tentative de lecture déclenchera une erreur fatale "descripteur de fichier invalide".
nohup some_command > /dev/null 2>&1&
C'est tout ce que vous devez faire!
Avez - vous essayé de rediriger les trois flux d'E / S:
nohup ./yourprogram > foo.out 2> foo.err < /dev/null &
Vous pouvez utiliser le détacher programme. Vous l'utilisez comme nohup
mais il ne produit pas de journal de sortie sauf si vous le dites. 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.
Notez que je n'ai aucune affiliation avec l'auteur du programme. Je ne suis qu'un utilisateur satisfait du programme.
sudo bash -c "nohup /opt/viptel/viptel_bin/log.sh $* &> /dev/null" &
Rediriger la sortie de sudo provoque sudo à reask pour le mot de passe, donc un mécanisme maladroit est nécessaire pour faire cette variante.
La commande suivante vous permettra d'exécuter quelque chose en arrière-plan sans obtenir nohup.sortie:
nohup command |tee &
De cette façon, vous pourrez obtenir la sortie de la console lors de l'exécution du script sur le serveur distant:
Vous pouvez faire ci-dessous nohup & > 2>&1 & par exemple Je n'ai pas de commande hup dans le script ./Runjob.sh > sparkConcuurent.sortie 2> & 1
Si vous avez un shell BASH sur votre mac/linux en face de vous, vous essayez les étapes ci-dessous pour comprendre la redirection pratiquement :
Créer un script de 2 lignes appelé zz.sh
#!/bin/bash
echo "Hello. This is a proper command"
junk_errorcommand
- la sortie de la commande echo va dans STDOUT filestream (descripteur de fichier 1).
- la sortie de la commande error va dans STDERR filestream (descripteur de fichier 2)
Actuellement, l'exécution simple du script envoie à la fois STDOUT et STDERR à l'écran.
./zz.sh
Maintenant commencez par la redirection standard:
zz.sh > zfile.txt
Dans ce qui précède, "echo" (STDOUT) va dans le fichier zfile.txt. Alors que "erreur" (STDERR) est affiché sur l'écran.
Ce qui précède est le même que:
zz.sh 1> zfile.txt
Maintenant, vous pouvez essayer le contraire, et rediriger" error " STDERR dans le fichier. La commande STDOUT de "echo" va à l'écran.
zz.sh 2> zfile.txt
En combinant les deux ci-dessus, vous obtenez:
zz.sh 1> zfile.txt 2>&1
Explication:
- Tout d'abord, envoyez STDOUT 1 à zfile.txt
- alors, envoyer STDERR 2 à STDOUT 1 lui-même (en utilisant & 1 pointeur).
- par conséquent, 1 et 2 vont dans le même fichier (zfile.txt)
Finalement, vous pouvez emballer le tout dans la commande nohup & pour l'exécuter en arrière-plan:
nohup zz.sh 1> zfile.txt 2>&1&