Comment obtenir le code de sortie correct de nohup

Dans la documentation nohup dans info coreutils 'nohup invocation' il est écrit:

 Exit status: 125 if `nohup' itself fails, and `POSIXLY_CORRECT' is not set 126 if COMMAND is found but cannot be invoked 127 if COMMAND cannot be found the exit status of COMMAND otherwise 

Cependant, les seuls codes de sortie que je n’ai jamais eu depuis nohup sont 1 et 0. J’ai une commande nohup qui échoue dans un script, et j’ai besoin de l’exception appropriée … et sur la base de cette documentation, je suppose que nohup code de sortie devrait être 126. Au lieu de cela, il est 0.

La commande que je nohup perl myscript.pl & est: nohup perl myscript.pl &

Est-ce parce que Perl sort avec succès?

Si votre script shell exécute le processus avec:

 nohup perl myscript.pl & 

vous renoncez plus ou moins à la possibilité de récupérer le statut de sortie de nohup . La commande dans son ensemble réussit avec 0 si le shell a créé un fork et échoue avec 1 si le shell ne parvient pas à bifurquer. Dans bash , vous pouvez attendre la fin du processus d’arrière-plan et récupérer son statut via wait :

 nohup perl myscript.pl & oldpid=$! ...do something else or this whole rigmarole is pointless... wait $oldpid echo $? 

Le $? écho $? est généralement le statut de sortie du PID spécifié (sauf si le PID spécifié est déjà mort et attendu).

Si vous exécutez le processus de manière synchrone, vous pouvez détecter les différents états de sortie:

 ( nohup perl myscript.pl echo "PID $! exited with status $?" >&2 ) & 

Et maintenant, vous devriez être en mesure de repérer les différents états de sortie de nohup (par exemple, essayez différentes orthographes: nohup pearl myscript.pl , etc.).

Notez que le sous-shell dans son ensemble est exécuté en arrière-plan, mais le nohup est exécuté de manière synchrone dans le sous-shell.

À ma connaissance, la question était de savoir comment obtenir le statut de la commande lorsqu’elle était en cours d’exécution. Comme mon expérience, il était très peu probable que vous ayez pu obtenir le statut de sortie de la commande même en cas d’échec immédiat. La plupart du temps, vous venez d’obtenir le statut de sortie «nohup COMMAND &» à moins que vous n’attendiez ou ne synchronisiez comme mentionné par Jonathan. Pour vérifier le statut de la commande juste après nohup, j’utilise:

 
   pid = `ps -eo pid, cmd |  awk '/ COMMAND / {print $ 1}' `
   if [-z $ pid];  puis
      echo "la commande a échoué"
   autre
      echo "la commande est en cours d'exécution dans nohup"
   Fi