There are two ways of doing this:
1. Command &: Background run, you shut down the terminal will stop running
2. Nohup Command &: Run in the background, you will continue to run the terminal
First, Introduction
Linux/unix the biggest advantage of the Microsoft platform is the real multi-user, multi-tasking. Therefore, in the task management also has the characteristic management thought.
We know that on Windows, we either have a program running in the background as a service or stop the service. Instead of allowing the program to switch between foreground and background. Linux provides FG and BG commands that allow you to easily schedule tasks that are running. Suppose you find that a program running in the foreground takes a long time, but you need to do something else, you can hang up the program with Ctrl-z, and then you can see the system prompt:
[1]+ stopped/root/bin/rsync.sh
Then we can schedule the program to execute in the background: (the number behind BG is the job number)
#bg 1
[1]+/root/bin/rsync.sh &
Use the Jobs command to view the tasks that are running:
#jobs
[1]+ running/root/bin/rsync.sh &
If you want to bring it back to the foreground, you can use
#fg 1
/root/bin/rsync.sh
This way, you can only wait for the task to complete on the console.
& Throw instructions into the background to execute
[Ctrl]+z pauses the foreground task in the background
Jobs View the working status of the background
FG%jobnumber The backstage task to the front desk for processing.
BG%jobnumber put tasks in the background to handle
Kill management tasks in the background
Second, &
In Linux, when a job is run in the foreground, the terminal is occupied by the job, and when the job is run in the background, it does not occupy the terminal. You can use the & command to place jobs in the background. In fact, this is where the command is put into a job queue:
$./test.sh &
[1] 17208
$ jobs-l
[1]+ 17208 running ./test.sh &
Be careful when running a job in the background: commands that require user interaction are not executed in the background, because your machine will be there to be silly. However, a job running in the background will output the results to the screen, interfering with your work. If a job that runs in the background produces a lot of output, it is best to redirect its output to a file using the following method:
command >out.file 2 >&1 &
In the example above, 2>&1 means that all standard output and error output will be redirected to a file called Out.file. When you successfully submit a process, a process number is displayed, which can be used to monitor the process, or to kill it.
Example: Find a file named "httpd.conf" and redirect all standard output and error output to the Find.dt file:
# find/etc/ httpd/-name "httpd.conf"-print >find.dt 2>&1 &
[2] 7832
After the command was successfully submitted, the system gives its process number 7832. For a command that has already been executed in the foreground, it can be re-placed in the background, first by pressing CTRL + Z to pause the process that is already running, and then using the BG command to put the stopped job in the background, such as tesh.sh, which is being executed at the foreground, by using CTRL + Z to suspend it:
$./test.sh
[1]+ stopped ./test.sh
$ bg%1
[1]+./test.sh &
$ jobs-l
[1]+ 22794 Running./test.sh &
However, if the process is executed above the background, its parent process is still the process of the current terminal shell, and once the parent process exits, the hangup signal is sent to all child processes, and the child process will exit after receiving hangup. If we are going to continue running the process while exiting the shell, we need to use nohup to ignore the hangup signal, or SETSID to set the parent process to the INIT process (process number 1)
$ echo $$
21734
$ nohup./test.sh &
[1] 29016
$ PS-EF | grep test
515 29710 21734 0 11:47 pts/12 00:00:00/bin/sh./test.sh
515 29713 21734 0 11:47 pts/12 00:00:00 grep test
$ setsid./test.sh &
[1] 409
$ PS-EF | grep test
515 410 1 0 11:49? 00:00:00/bin/sh./test.sh
515 413 21734 0 11:49 pts/12 00:00:00 grep test
The above experiment demonstrates the use of Nohup/setsid plus & to make the process run in the background without being affected by the current shell exit. So what do you do with processes that are already running in the background? You can use the Disown command:
$./test.sh &
[1] 2539
$ jobs-l
[1]+ 2539 Running./test.sh &
$ disown-h%1
$ PS-EF | grep test
515 410 1 0 11:49? 00:00:00/bin/sh./test.sh
515 2542 21734 0 11:52 pts/12 00:00:00 grep test
There is also a way, even if the process is executed in a subshell, in fact, this is similar to Setsid. The method is simple, enclose the command in parentheses ():
$ (./test.sh &)
$ PS-EF | grep test
515 410 1 0 11:49? 00:00:00/bin/sh./test.sh
515 12483 21734 0 11:59 pts/12 00:00:00 grep test
Note: The test environment for this article is red Hat Enterprise Linux as Release 4 (Nahant Update 5), Shell is/bin/bash, different OS and Shell may command somewhat differently. For example, Aix ksh, there is no disown, but you can use the Nohup-p PID to achieve disown the same effect.
There is also a more powerful way is to use screen, first create a disconnected mode of the virtual terminal, and then use the-r option to reconnect the virtual terminal, in which the execution of any command, can achieve the effect of nohup, which is more convenient when there are multiple commands in the background continuous execution:
$ SCREEN-DMS Screen_test
$ screen-list
There is a screens on:
27963.screen_test (Detached)
1 Socket In/tmp/uscreens/s-jiangfeng.
$ screen-r Screen_test
Source: http://www.cnblogs.com/lwm-1988/archive/2011/08/20/2147299.html
Linux command background run