disown
What if we run a process and then want to keep it alive even after the interactive shell has been closed? Let's recall what happens when a shell exits: before exiting, it sends SIGHUP
to all the jobs running. If a job is in stop state, the shell will send it a SIGCONT
signal to resume it so that it can receive the SIGHUP
signal and gracefully die. To accomplish this task, the shell browses a table where it keeps all the jobs, and here is the trick. Let's start a script in the background a few times:
zarrelli:~$ ./while.sh & ./while.sh & ./while.sh & [1] 8944 [2] 8945 [3] 8946
Now let's have a look at the shell job table:
zarrelli:~$ jobs [1] Running ./while.sh & [2]- Running ./while.sh & [3]+ Running ./while.sh &
We can see all three processes running as we expected. Now do the fun stuff:
zarrelli:~$ disown %2
What just happened to the job with ID 2
?
zarrelli:~$ jobs [1]- Running ./while.sh & [3]+ Running ./while.sh &
Well, it disappeared from the job table...