Помни про tmux
и screen
!
In this guide, we shall bring to light a simple yet important concept in process handling in a Linux system, that is how to completely detach a process from its controlling terminal.
When a process is associated with a terminal, two problems might occur:
To deal with these two issues, you need to totally detach a process from a controlling terminal. Before we actually move to solve the problem, let us briefly cover how to run processes in the background.
If a process is already in execution, such as the tar command example below, simply press Ctrl+Z
to stop it then enter the command bg
to continue with its execution in the background as a job.
You can view all your background jobs by typing jobs. However, its stdin, stdout, stderr are still joined to the terminal.
$ tar -czf home.tar.gz .
$ bg
$ jobs
You can as well run a process directly from the background using the ampersand, &
sign.
$ tar -czf home.tar.gz . &
$ jobs
We will use disown
command, it is used after the a process has been launched and put in the background, it’s work is to remove a shell job from the shell’s active list jobs, therefore you will not use fg
, bg
commands on that particular job anymore.
In addition, when you close the controlling terminal, the job will not hang or send a SIGHUP to any child jobs.
Let’s take a look at the below example of using diswon
bash built-in function.
$ sudo rsync Templates/* /var/www/html/files/ &
$ jobs
$ disown -h %1
$ jobs
You can also use nohup
command, which also enables a process to continue running in the background when a user exits a shell.
$ nohup tar -czf iso.tar.gz Templates/* &
$ jobs
Therefore, to completely detach a process from a controlling terminal, use the command format below, this is more effective for graphical user interface (GUI) applications such as firefox:
$ firefox </dev/null &>/dev/null &
In Linux, /dev/null
is a special device file which writes-off (gets rid of) all data written to it, in the command above, input is read from, and output is sent to /dev/null
.
As a concluding remark, provided a process is connected to a controlling terminal, as a user, you will see several output lines of the process data as well as error messages on your terminal. Again, when you close the a controlling terminal, your process and child processes will be terminated.