在Linux中,如果要让进程在后台运行,一般情况下,我们在命令后面加上&即可,实际上,这样是将命令放入到一个作业队列中了:
1
$ ./test.sh &
2
[1] 17208
3
4
$ jobs -l
5
[1]+ 17208 Running ./test.sh &
对于已经在前台执行的命令,也可以重新放到后台执行,首先按ctrl+z暂停已经运行的进程,然后使用bg命令将停止的作业放到后台运行:
1
$ ./test.sh
2
[1]+ Stopped ./test.sh
3
4
$bg
%1
5
[1]+ ./test.sh &
6
7
$ jobs -l
8
[1]+ 22794 Running ./test.sh &
但是如上方到后台执行的进程,其父进程还是当前终端shell的进程,而一旦父进程退出,则会发送hangup信号给所有子进程,子进程收到hangup以后也会退出。如果我们要在退出shell的时候继续运行进程,则需要使用nohup忽略hangup信号,或者setsid将将父进程设为init进程(进程号为1)
1
$echo
$$
2
21734
3
4
$nohup
./test.sh &
5
[1] 29016
6
7
$ps
-ef |grep test
8
515 29710 21734 0 11:47 pts/12 00:00:00 /bin/sh ./test.sh
9
515 29713 21734 0 11:47 pts/12 00:00:00grep test
1
$ setsid ./test.sh &
2
[1] 409
3
4
$ps