Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to get the proper exit code from nohup

Tags:

unix

nohup

From the nohup documentation in info coreutils 'nohup invocation' it states:

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

However, the only exit codes I've ever gotten from nohup have been 1 and 0. I have a nohup command that's failing from within a script, and I need the exception appropriately...and based on this documentation I would assume that the nohup exit code should be 126. Instead, it is 0.

The command I'm running is: nohup perl myscript.pl &

Is this because perl is exiting successfully?

like image 995
pepper Avatar asked Mar 27 '13 01:03

pepper


People also ask

How do I find my exit code?

To display the exit code for the last command you ran on the command line, use the following command: $ echo $? The displayed response contains no pomp or circumstance. It's simply a number.

How do I exit after nohup?

Ending the nohup command with an & makes the command run in the background, even after you exit the shell. To exit the shell in this situation, enter the exit command.

How do I set an exit code?

To set an exit code in a script use exit 0 where 0 is the number you want to return. In the following example a shell script exits with a 1 . This file is saved as exit.sh . Executing this script shows that the exit code is correctly set.

Can I close the terminal with nohup?

Using 'nohup' With Your CommandIf you close the terminal, the process will keep running until you close it. When the terminal is open, the job is still in the foreground and still under the shell's job control. This means if you just use nohup, you still can't use that terminal for other tasks.


2 Answers

If your shell script runs the process with:

nohup perl myscript.pl &

you more or less forego the chance to collect the exit status from nohup. The command as a whole succeeds with 0 if the shell forked and fails with 1 if the shell fails to fork. In bash, you can wait for the background process to die and collect its status via wait:

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

The echoed $? is usually the exit status of the specified PID (unless the specified PID had already died and been waited for).

If you run the process synchronously, you can detect the different exit statuses:

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

And now you should be able to spot the different exit statuses from nohup (eg try different misspellings: nohup pearl myscript.pl, etc).

Note that the sub-shell as a whole is run in the background, but the nohup is run synchronously within the sub-shell.

like image 179
Jonathan Leffler Avatar answered Sep 20 '22 07:09

Jonathan Leffler


As my understanding, the question was how to get the command status when it was running in nohup. As my experiences it was very little chance that you were able to get the COMMAND exit status even when it failed right away. Most time you just got the 'nohup COMMAND &' exit status unless you wait or synchronize as Jonathan mentioned. To check the COMMAND status right after nohup, I use:

 
  pid=`ps -eo pid,cmd | awk '/COMMAND/ {print $1}'`
  if [ -z $pid ]; then
     echo "the COMMAND failed"
  else
     echo "the COMMAND is running in nohup"
  fi
like image 37
John Avatar answered Sep 18 '22 07:09

John