Tuesday, December 24, 2013

make a process continue to run after log out from ssh

Detach Processes With Disown and Nohup

 
Many system administrators make a practice of using GNU Screen or tmux to manage jobs running in the terminal. If you have a long-running job that you want to "detach" from the terminal, you can simply use your terminal multiplexer to do it. But what if you don't use tmux or Screen, or you just forgot? For those times, there's nohup and disown.
Have a long-running job you want to "detach" from the terminal? Don't use tmux or Screen? If you haven't started the job yet, nohup is an easy to use option, and if you must stop a job in the middle, there's disown.When I'm going to be working at a project for any amount of time, I'm usually running screen or tmux (I usually default to screen, but I have been spending more time with tmux lately to become more familiar with it). But sometimes I'll log into my server or another system and start a job -- like a backup, or copying a really large file -- and realize that I want to close the connection for one reason or another. (One of the downsides in working from a laptop at a coffee shop ...)
If you haven't started the job yet, there's nohup. Short for "no hangup," nohup will detach the program from the current shell and send its output to nohup.out. If you quit the shell or whatever, the process will continue to run until it completes.
Ah, but what if you forget to use nohup, or if you didn't expect to be leaving the computer but get called away? Then there's disown.
The use of disown is a bit more complex. While the command is running, use Ctrl-z to stop it and then use bg to put it in the background. Then you'll use disown %n where n is the job number (jobspec). And, of course, you can find the job number using the jobs command. Run jobs again to verify that the job has been detached -- and you can use ps or top to verify that the job is actually still running.
And that's all there is to it. Complex? No. But you'd be surprised how many new admins -- especially those coming from Windows environments -- are unfamiliar with these utilities.
Note that disown is specific to GNU Bash, so you may not find it on some systems. The nohup command is implemented as a Bash built-in, but also as a separate utility on some systems, so be sure to check if its behavior differs from what's described here.


 Example to run disown

$ disown -h %1
$ bg 1
[1]+ myprogram &
$ logout

No comments:

Post a Comment