What's the difference between nohup and ampersand

186,043

Solution 1

nohup catches the hangup signal (see man 7 signal) while the ampersand doesn't (except the shell is confgured that way or doesn't send SIGHUP at all).

Normally, when running a command using & and exiting the shell afterwards, the shell will terminate the sub-command with the hangup signal (kill -SIGHUP <pid>). This can be prevented using nohup, as it catches the signal and ignores it so that it never reaches the actual application.

In case you're using bash, you can use the command shopt | grep hupon to find out whether your shell sends SIGHUP to its child processes or not. If it is off, processes won't be terminated, as it seems to be the case for you. More information on how bash terminates applications can be found here.

There are cases where nohup does not work, for example when the process you start reconnects the SIGHUP signal, as it is the case here.

Solution 2

myprocess.out & would run the process in background using a subshell. If the current shell is terminated (say by logout), all subshells are also terminated so the background process would also be terminated. The nohup command ignores the HUP signal and thus even if the current shell is terminated, the subshell and myprocess.out would continue to run in the background. Another difference is that & alone doesn't redirect the stdout/stderr so if there are any output or error, those are displayed on the terminal. nohup on the other hand redirect the stdout/stderr to nohup.out or $HOME/nohup.out.

Solution 3

Most of the time we login to remote server using ssh. If you start a shell script and you logout then the process is killed. Nohup helps to continue running the script in background even after you log out from shell.

Nohup command name &
eg: nohup sh script.sh &

Nohup catches the HUP signals. Nohup doesn't put the job automatically in the background. We need to tell that explicitly using &

Solution 4

Using the ampersand (&) will run the command in a child process (child to the current bash session). However, when you exit the session, all child processes will be killed.

using nohup + ampersand (&) will do the same thing, except that when the session ends, the parent of the child process will be changed to "1" which is the "init" process, thus preserving the child from being killed.

Solution 5

Correct me if I'm wrong

  nohup myprocess.out &

nohup catches the hangup signal, which mean it will send a process when terminal closed.

 myprocess.out &

Process can run but will stopped once the terminal is closed.

nohup myprocess.out

Process able to run even terminal closed, but you are able to stop the process by pressing ctrl + z in terminal. Crt +z not working if & is existing.

Share:
186,043

Related videos on Youtube

Yarkee
Author by

Yarkee

Pythoner. Coding for fun.

Updated on July 24, 2022

Comments

  • Yarkee
    Yarkee almost 2 years

    Both nohup myprocess.out & or myprocess.out & set myprocess.out to run in the background. After I shutdown the terminal, the process is still running. What's the difference between them?

    • shx2
      shx2 about 11 years
      what shell are you using? the behavior varies across shells
    • Yarkee
      Yarkee about 11 years
      bash. And I know why now according @nemo 's answer.
    • nemo
      nemo about 11 years
      @Yarkee if the answer suits your problem, please mark the question as accepted (the checkbox below the answer's votes) so it's not dangling around as unanswered. You should do so for all your questions :)
    • Patrizio Bertoni
      Patrizio Bertoni over 9 years
      shutdown should be avoided as a term with a specific Linux meaning., and be replaced by exit.
  • Yarkee
    Yarkee about 11 years
    I run myprocess.out & and exit the shell. However, when I use ps aux | grep myprocess.out in other shell, I still can find "myprocess.out". It means than the process is still running, not be terminated.
  • nemo
    nemo about 11 years
    @amit_g When killing the parent shell with kill -9 there won't be a SIGHUP as this would require the parent shell to handle SIGKILL, which it can't.
  • amit_g
    amit_g about 11 years
    Check shopt | grep hupon as mentioned in the other answer.
  • Vaibhav Kaushal
    Vaibhav Kaushal over 9 years
    Thanks. Wasn't expecting your answer but the fact that it is here is great. It answers the question I did not ask :D
  • studgeek
    studgeek almost 4 years
    It may be worth noting that just & does cause the subcommand to not receive some signals (e.g. SIGINT). nohup essentially adds SIGHUP to the list of signals that are not propagated.
  • preOtep
    preOtep almost 3 years
    Technically ctrl Z just suspends the process - you can resume the process with bg (background) or fg (foreground). There might be some confusion with 'stop' as it could be interpreted as the process cannot be resumed.
  • SpinUp __ A Davis
    SpinUp __ A Davis over 2 years
    as pointed out in @Devender's answer below, this is only true in a bash terminal if huponexit is set to 'on'