Linux的作业管理:前台作业、后台作业
比如有以下脚本,打印5次信息:
root@db2a:~# cat job1.sh
#!/bin/bash
for i in 1 2 3 4 5
do
echo "This is "$i"th running"
sleep 3
done
root@db2a:~# ./job1.sh
This is 1th running
This is 2th running
This is 3th running
This is 4th running
This is 5th running
root@db2a:~# ./job1.sh &
root@db2a:~# vi tmp1
...
"tmp1" [New File] 0,0-1 All
[1]+ Stopped vi tmp1
再前台进行第二个作业,进行到一半时,按下ctrl+z,同样的,放到后台并停止执行,作业号为2:
root@db2a:~# ./job1.sh
This is 1th running
This is 2th running
^Z <--按ctrl+z
[2]+ Stopped ./job1.sh
root@db2a:~# jobs -l
[1]- 4294 Stopped vi tmp1
[2]+ 4327 Stopped ./job1.sh
root@db2a:~# ps -ef | grep -e 4327 -e 4294
root 4294 3855 0 02:17 pts/1 00:00:00 vi tmp1
root 4327 3855 0 02:17 pts/1 00:00:00 /bin/sh ./job1.sh
root 4329 4327 0 02:17 pts/1 00:00:00 sleep 3
root 5253 3855 0 02:27 pts/1 00:00:00 grep --color=auto -e 4327 -e 4294
root@db2a:~# fg %2
./job1.sh
This is 3th running
This is 4th running
This is 5th running
bg %jobnumber
root@db2a:~# kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX
nohup command &
比如有以下脚本,打印5次信息:
root@db2a:~# cat job1.sh
#!/bin/bash
for i in 1 2 3 4 5
do
echo "This is "$i"th running"
sleep 3
done
1. 普通作业
普通情况,进行作业:root@db2a:~# ./job1.sh
This is 1th running
This is 2th running
This is 3th running
This is 4th running
This is 5th running
2. 后台作业
后台方式执行作业时,需要在作业后面加一个&,例如:root@db2a:~# ./job1.sh &
3. 普通作业转到后台
要把前台作业放到后台,并暂停执行,则需要在前台ID执行的时候按 Ctrl+z,下面的例子中,有两个作业,第一个作业是vi,在进入普通模式后,按下ctrl+z键,将其停止并放入后台,作业号为1:root@db2a:~# vi tmp1
...
"tmp1" [New File] 0,0-1 All
[1]+ Stopped vi tmp1
再前台进行第二个作业,进行到一半时,按下ctrl+z,同样的,放到后台并停止执行,作业号为2:
root@db2a:~# ./job1.sh
This is 1th running
This is 2th running
^Z <--按ctrl+z
[2]+ Stopped ./job1.sh
4. 查看后台作业列表
可以使用jobs -l命令查看后台作业,方括号内的表示作业编号,第三列表示作业的PIDroot@db2a:~# jobs -l
[1]- 4294 Stopped vi tmp1
[2]+ 4327 Stopped ./job1.sh
root@db2a:~# ps -ef | grep -e 4327 -e 4294
root 4294 3855 0 02:17 pts/1 00:00:00 vi tmp1
root 4327 3855 0 02:17 pts/1 00:00:00 /bin/sh ./job1.sh
root 4329 4327 0 02:17 pts/1 00:00:00 sleep 3
root 5253 3855 0 02:27 pts/1 00:00:00 grep --color=auto -e 4327 -e 4294
5. 把后台作业调到前台继续执行
使用fg命令将后台作业调到前台,需要跟上%作业号: fg %jobnumber,下面是把第二个作业调到前台并继续执行root@db2a:~# fg %2
./job1.sh
This is 3th running
This is 4th running
This is 5th running
6. 使后台作业继续执行
后台作业在后台继续执行,使用bg命令:bg %jobnumber
7. 向作业发送信号:
使用kill命令向作业发送信号,语法为: kill -signal %jobnumber,所有的signal信号可由kill -l的输出中看到,比较常用的有 SIGINT表示interrupt, SIGKILL表示强制杀掉,SIGTERM表示正常终止root@db2a:~# kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX
8. 关闭终端后继续运行
若想要关闭终端后使作业继续保持运行,可以在作业前加上nohup命令:nohup command &