(4)作业控制
(4.1)作业控制的含义
作业控制是指控制当前正在运行的进程的行为,也称为进程控制。作业控制是Shell的一个特性,使用户能在多个独立进程间进行切换。例如,用户可以挂起一个正在运行的进程,稍后再恢复其运行。bash记录所有启动的进程并保持对所有已启动的进程的跟踪,在每一个正在运行的进程生命期内的任何时候,用户可以任意地挂起进程或重新启动进程恢复运行。
例如,当用户使用Vi编辑一个文本文件,并需要中止编辑做其他事情时,利用作业控制,可以让编辑器暂时挂起,返回Shell 提示符开始做其他的事情。其他事情做完以后,用户可以重新启动挂起的编辑器,返回到刚才中止的地方,就像用户从来没有离开编辑器一样。这只是一个例子,作业控制还有许多实际的用途。
(4.2)实施作业控制的常用命令
下表中列出了作业控制的常用命令或操作快捷键。
作业控制的常用命令或操作快捷键功能说明 | |
命令或快捷键 | 功能说明 |
cmd & | 命令后的&符号表示将该命令放到后台运行,以免霸占终端 |
nohup cmd& | 将该命令放到后台运行,以免霸占终端,且用户注销后命令依然继续执行 |
<Ctrl D> | 终止一个正在前台运行的进程(含有正常含义) |
<Ctrl C> | 终止一个正在前台运行的进程(含有强行含义) |
<Curl Z> | 挂起一个正在前台运行的进程 |
jobs | 显示后台作业和被挂起的进程 |
bg | 在后台恢复运行一个被挂起的进程 |
fg | 在前台恢复运行一个被挂起的进程 |
这些命令常用于用户需要在后台运行却意外地放到了前台启动运行的时候。当一个命令在前台被启动运行时,会禁止用户与Shell的交互,直到该命令结束。由于大多数命令的执行都能很快完成,所以一般情况下不会有什么问题。但如果要运行的命令要花费很长时间的话,通常会把它放到后台,以便能在前台继续输入其他命令。此时,上面的命令就会派上用场了。
(4.3)作业控制举例
下面给出一个例子说明作业控制命令的使用。
操作步骤3.15 作业控制命令的使用
//列出所有正在运行的作业
$ jobs
//在前台运行睡眠进程
$ sleep 100000
//使用<Ctrl Z>挂起过程
[1] Stopped sleep 100000
// 在前台运行睡眠进程
$ sleep 200000
#使用<Ctrl Z> 挂起过程
[2] Stopped sleep 200000
//在后台运行睡眠进程
$ sleep 300000 &
[3] 8941
//运行cat命令
$ cat >example
This is a example.
//使用<Ctr1 Z>挂起过程
[4] Stopped cat >example
//列出所有正在运行的作业
//第1列是作业号,第2列中的 表示默认作业; -表示第默认作业
//第3列是作业状态
$ jobs
[1] Stopped sleep 100000
[2]- Stopped sleep 200000
[3] Running sleep 300000 &
[4] Stopped cat >example
//列出所有正在运行的作业,同时列出进程PID
$jobs -l
[1] 8939 Stopped sleep 100000
[2]- 8940 Stopped sleep 200000
[3] 8941 Running sleep 300000 &
[4] 8942 Stopped cat >example
//将第二默认作业(以标识)在后台继续运行
$bg %-
[2]- seep 2000080
$jobs -l
[1]- 8939 Stopped sleep 100000
[2] 8940 Running sleep 200000 &
[3] 8941 Running sleep 30000 &
[4] 8942 Stopped cat >example
//将1号作业在后台继续运行
$bg %1
[1]- sleep 00000 &
$ jobs -l
[1] 8939 Running sleep 00000 &
[2] 8940 Running sleep 200000 &
[3]- 8941 Running sleep 300000 &
[4] 8942 Stopped cat >example
//将默认作业 (以 标识)在前台继续运行
# fg等同于fg % ; bg等同于bg %
$fg
cat >example
//使用<Ctrl D>结束进程
$ jobs -l
[1] 8939 Running sleep 00000 &
[2]- 8940 Running sleep 200000 &
[3] 8941 Running sleep 30000&8
//杀死1号作业
$ kill %1
$ jobs -l
[1] 8939 Termninated sleep 000000
[2]- 8940 Running sleep 200000 &
[3] 8941 Running sleep 300000 &
//杀死默认作业 (以 标识)
$ kill %
$ jobs -l
[2]- 8940 Running sleep 00000 &
[3] 8941 Terminated sleep 300000
//在后台执行脚本,且注销后仍然继续执行
$ nohup . /my_ symc repo.sh &
注意:
Windows用户通常有随时按快捷键<Ctrl S> 进行保存的习惯,但在Linux
的终端上按快捷键<Crl S>表示挂起终端,要解除挂起需按快捷键<Ctrl Q>。