当我们为完成一些复杂的任务而将多个命令通过 |,\>,<, ;, (,)
等组合在一起时,通常这个命令序列会启动多个进程,它们间通过管道等进行通信。而有时在执行一个任务的同时,还有其他的任务需要处理,那么就经常会在命令序列的最后加上一个&,或者在执行命令后,按下 CTRL+Z
让前一个命令暂停。以便做其他的任务。等做完其他一些任务以后,再通过 fg
命令把后台任务切换到前台。这样一种控制过程通常被成为作业控制,而那些命令序列则被成为作业,这个作业可能涉及一个或者多个程序,一个或者多个进程。下面演示一下几个常用的作业控制操作。
范例:创建后台进程,获取进程的作业号和进程号
$ sleep 50 &
[1] 11137
范例:把作业调到前台并暂停
使用 Shell 内置命令 fg
把作业 1 调到前台运行,然后按下 CTRL+Z
让该进程暂停
$ fg %1
sleep 50
^Z
[1]+ Stopped sleep 50
范例:查看当前作业情况
$ jobs #查看当前作业情况,有一个作业停止
[1]+ Stopped sleep 50
$ sleep 100 & #让另外一个作业在后台运行
[2] 11138
$ jobs #查看当前作业情况,一个正在运行,一个停止
[1]+ Stopped sleep 50
[2]- Running sleep 100 &
范例:启动停止的进程并运行在后台
$ bg %1
[2]+ sleep 50 &
不过,要在命令行下使用作业控制,需要当前 Shell,内核终端驱动等对作业控制支持才行。
参考资料
- 《UNIX 环境高级编程》