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

tech2026-10-03  1

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

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下执行,而第二条命令则不可以。

最新回复(0)