Introduction#
When we execute a long-running command or script on a Linux or Unix system, we often encounter a problem where the process stops running when the terminal is closed or exited. In such cases, we need a way to run the process in the background without being affected by the terminal closure. This is where the nohup
command comes in handy.
What is nohup?#
nohup
is a command in Linux and Unix systems that allows a process to continue running in the background even after the terminal is closed. Its full name is "no hang up," meaning "do not hang up." The nohup
command allows you to continue running a command after exiting the terminal or closing an SSH connection.
Syntax rules for nohup#
The basic syntax of the nohup
command is as follows:
nohup COMMAND [ARGS ...] [> output-file 2> error-file] &
The meanings of the parameters are as follows:
COMMAND
: The command or script to run in the background.ARGS
: The arguments for the command or script.> output-file
: Redirects the output to the specified file.2> error-file
: Redirects the error messages to the specified file.&
: Runs the command in the background.
The execution process of the nohup
command consists of the following steps:
- The
nohup
command redirects the standard input, standard output, and standard error output of the current shell to the/dev/null
device to avoid being interrupted by the signal of closing the terminal. - The
nohup
command puts the process in the background and outputs the process ID (PID) to the terminal. - The process starts executing and redirects the standard output and standard error output to the specified file.
- The user can exit the terminal or close the terminal window, and the process will continue running in the background.
How to use nohup#
Using the nohup
command is very simple, just follow the basic syntax mentioned above. Here are some examples of how to use the nohup
command:
Running a command in the background#
To run a command in the background, simply enter the following command in the command line:
nohup COMMAND &
For example, to run a Bash script in the background:
nohup bash test.sh &
Redirecting standard output to a file#
nohup bash test.sh > stdout.txt &
Redirecting standard error to a file#
nohup bash test.sh 2> stderr.txt &
Redirecting both standard output and standard error to a file#
- Redirecting to the same file
nohup bash test.sh > output.txt 2>&1 &
- Redirecting to different files
nohup bash test.sh > stdout.txt 2> stderr.txt &
- A more complex example, redirecting standard input (stdin):
nohup ./myprogram > foo.out 2> foo.err < /dev/null &
Here, an additional < /dev/null
is used to redirect the standard input to /dev/null
to ensure that the program does not read any data from the standard input.
This is to solve a practical problem: SSH sessions often refuse to log out (or hang up) because they don't want to lose data that interacts with background job(s). When encountering this problem, you can use the above command to solve it by redirecting three times.
nohup background process management#
The jobs
command can be used to view the list of background tasks currently running in the shell, including task numbers, status, and commands.
For example, if we run the sleep 1000
command in the background and use the jobs
command to view it:
$ jobs
[1]+ Running nohup sleep 1000 &
In the above output, the number in the square brackets represents the task number, the plus or minus sign represents the priority of the task, and Running
indicates that the task is running in the background. In addition to this, there are other possible statuses, including Stopped
, Done
, etc.
We can also use the fg
command to move a background task to the foreground and continue running it, for example:
$ fg %1
This command will move the task with the task number 1 to the foreground and continue execution. If you want to pause or resume a task, you can use the Ctrl-Z
key to send the SIGTSTP
signal in the current shell.
$ fg %1
nohup sleep 1000
^Z
[1]+ Stopped nohup sleep 1000
If you want to resume execution at this point, you can use the bg
command:
$ bg %1
[1]+ nohup sleep 1000 &
If you want to kill the task, you can use the kill
command:
$ kill %1
[1]+ Terminated nohup sleep 1000
If you want to kill all background tasks but find it cumbersome to do it one by one, you can use the disown
command:
$ disown -a
This command kills all background tasks without any prompts, and you can confirm it by using the jobs
command.
Summary#
The nohup
command allows programs to run in the background without being affected by the closure of the terminal or the disconnection from a remote server. Processes started with the nohup
command ignore all terminal signals, so even if you use Ctrl+C
to close the terminal, the process will not stop. You can use the jobs
command to view background processes and use the fg
command to switch a process to the foreground.
nohup
is ideal for running scripts or programs that require a long time to execute, such as web servers and databases. However, it should be noted that the nohup
command does not completely prevent the possibility of a process being interrupted, such as system crashes or process errors.
References#
https://en.wikipedia.org/wiki/Nohup
Welcome to visit my personal blog: 方寸之间