4. 作业和作业控制

当我们为完成一些复杂的任务而将多个命令通过 |,\>,<, ;, (,) 等组合在一起时,通常这个命令序列会启动多个进程,它们间通过管道等进行通信。而有时在执行一个任务的同时,还有其他的任务需要处理,那么就经常会在命令序列的最后加上一个&,或者在执行命令后,按下 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 环境高级编程》