Some of the tasks that I do involve running commands that take way long to finish - some take a few hours, others take a couple of days. Obviously, you can't be staring at the terminal till the task is done. And if you close the terminal, the command dies away. So how to run these commands? Simply running them in background won't help, as they would be terminated when you log out.
One idea is to run them in background, and using
nohup.
$ nohup my_cmd &$ exitThis would start the command in the background in such a way that it won't be stopped even if you log out. But you won't see the output at your terminal.
nohup would redirect it to a file named
nohup.outOnce I start the command using nohup, there is no way I can interact with it. And I can't see the output at the terminal. Sure, there is a way if I really want to. Keep watching: $
tail -f nohup.outA better alternative in these scenarios is to use the GNU Screen utility. It offers many useful features.
* I can start the command and leave it alone. Later, I can see how it is progressing whenever I want to.
* I can start the command from one computer, and then see how it is progressing from a different computer. So I can start the task at office, then go home, and when I find time, check how it is going.
* More than one users can share a screen. So if my colleague wants to check, he can also connect to the same screen and see the progress.
* Multiple terminal sessions can be created in a screen session. So I can keep running the command in one of them, and do something else in the other.
* Screen is very helpful when the network connection is unreliable. I would still have the task running even if connection breaks.
Enough. Tel me how do I start.
Check if a screen session is already running
$ screen -lsAttach to a not detached session
$ screen -x
Start a new screen session
$ screen
Create a new terminal session
CTRL+a cToggle between two terminal sessions
CTRL+a CTRL+a
Go to the
nth terminal session
CTRL+a nSend the command character
CTRL+a to a window
CTRL+a aDetach from a screen
CTRL+a d
Terminate the screen
$ exit
man screen for more information