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 through 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...