Shell命令:任务控制命令fg、bg、ctrl+z、jobs

使用&符号后台执行作业:

root@xjb:~# sleep 1111 &
[1] 43442
root@xjb:~# sleep 2222 &
[2] 43443
root@xjb:~# sleep 3333 &
[3] 43444

中括号里的数字为作业序号(JOB_SPEC), 后面的数字为PID


查看作业信息:

root@xjb:~# jobs -l
[1]  43442 Running                 sleep 1111 &
[2]- 43443 Running                 sleep 2222 &
[3]+ 43444 Running                 sleep 3333 &

作业序号后面的+表示当前作业-表示当前作业的下一个作业


把后台序号为1的作业调至前台执行,并让其成为当前作业

root@xjb:~# fg 1
sleep 1111

若不加序号参数,则会将当前作业调至前台执行。


把前台作业调至后台并暂停:按快捷键ctrl+z

^Z
[1]+  Stopped                 sleep 1111

查看作业状态:

root@xjb:~# jobs -l
[1]+ 43442 Stopped                 sleep 1111
[2]  43443 Running                 sleep 2222 &
[3]- 43444 Running                 sleep 3333 &

可以看到1号作业已经是当前作业了。
注意到1号作业的状态是Stopped状态,命令最后没了&符号。


让1号作业由暂停状态转为执行:

root@xjb:~# bg 1
[1]+ sleep 1111 &

再查看作业状态:

root@xjb:~# jobs -l
[1]  43442 Running                 sleep 1111 &
[2]- 43443 Running                 sleep 2222 &
[3]+ 43444 Running                 sleep 3333 &

等1号作业执行完,再查看作业状态:

root@xjb:~# jobs -l
[1]  43442 Done                    sleep 1111
[2]- 43443 Running                 sleep 2222 &
[3]+ 43444 Running                 sleep 3333 &
root@xjb:~# jobs -l
[2]- 43443 Running                 sleep 2222 &
[3]+ 43444 Running                 sleep 3333 &

如果想关闭3号作业,先将其调至前台,然后按快捷键ctrl+c

root@xjb:~# fg 3
sleep 3333
^C
root@xjb:~# jobs -l
[2]+ 43443 Running                 sleep 2222 &

还有一点要注意:

作业(job)的概念是基于当前shell的。一个进程只有是当前shell的子进程,才可能算作当前shell的作业,才能用jobs命令查询到。

作业会有个作业序号,进程有个进程号(PID),进程号在任何shell里都能使用,是系统唯一的,作业序号只有在当前shell里能使用。

举个例子,比如kill命令。

在当前shell下启动个作业:

root@xjb:~# sleep 5000 &
[1] 44905

作业序号是1,进程号是44905。

在当前shell下,以下两条命令效果相同,都是杀死进程。

kill -9 44905
kill -9 %1

但是第一条命令可以在其他shell下执行,而第二条命令则不可以。

你可能感兴趣的:(shell命令)