Tuesday, September 14, 2010

nohup

nohup is a POSIX command to ignore the HUP (hangup) signal, enabling the command to keep running after the user who issues the command has logged out. The HUP (hangup) signal is by convention the way a terminal warns depending processes of logout.

nohup is most often used to run commands in the background as daemons. Output that would normally go to the terminal goes to a file called nohup.out if it has not already been redirected. This command is very helpful when there is a need to run numerous batch jobs which are inter-dependent.

nohup is a low-level utility simply configuring a command to ignore a signal. As seen below, nohup is very far from being a full-featured batch system solving all the problems of running programs asynchronously.

Example
The first of the commands below starts the program abcd in the background in such a way that the subsequent log out does not stop it.

$ nohup abcd &
$ exit
Note that these methods prevent the process from being sent a 'stop' signal on logout, but if input/output is being received for these files[which files?], they will still hang the terminal[1] . See Overcoming Hanging, below.

nohup is often used in combination with the nice command to run processes on a lower priority.

$ nohup nice abcd &
[edit] Existing jobs
Some shells (e.g. bash) provide a shell builtin that may be used to prevent SIGHUP being sent or propagated to existing jobs, even if they were not started with nohup. In bash, this can be obtained by using disown -h job; using the same builtin without arguments removes the job from the job table, which also implies that the job will not receive the signal. Another relevant bash option is shopt huponexit, which automatically sends the HUP signal to jobs when the shell is exiting normally.

[edit] Overcoming hanging
Nohuping backgrounded jobs is typically used to avoid terminating them when logging off from a remote SSH session. A different issue that often arises in this situation is that ssh is refusing to log off ("hangs"), since it refuses to lose any data from/to the background job(s)[2][3]. This problem can also be overcome by redirecting all three I/O streams:

nohup ./myprogram > foo.out 2> foo.err < /dev/null &
Also note that a closing SSH session does not always send a HUP signal to depending processes. Among others, this depends on whether a pseudo-terminal was allocated or not[4].

No comments: