作业管理:jobs

工作管理

    像前面学到的vitop等命令,都是占用了整个shell,只能等结束操作vi或者top才能进行其他操作。又或者说,一个压缩或者一个解压缩消耗了太长的时间。导致要等它完成才能进行其他操作。又或者后面学到通过源码编译的方法编译安装软件,特别是编译gcc,等几个小时。那么现在就来学习一下,怎样可以在一个shell上面进行多作业管理。

    由于假设我们只有一个终端接口,因此在可以出现提示字符让你操作的环境就称为前台(foreground),至于其他工作就可以让你放入后台 (background) 去暂停或运行。要注意的是,放到后台的工作想要运行时, 他必须不能够与使用者互动。举例来说, vim 绝对不可能在背景里面执行 (running)的!因为你没有输入数据他就不会跑啊! 而且放入背景的工作是不可以使用 CTRL + c 来终止的!

    总结一下,使用bash来进行工作管理,有以下几个注意事项:

  • 这些工作所触发的程序必须来自于当前自己的 shell 的子程序
  • 可以控制与下达指令的这个环境称为前台工作
  • 可以自行运行的工作,你无法使用CTRL + c终止他,可使用 bg/fg 调用该工作
  • 在后台中“执行”的程序不能等待 terminal/shell 的输入

后台运行的两种方法

第一种

    第一种将工作放到后台执行的方法,是在命令的最后面加上 &。这样按下回车键之后,工作就会进入到后台运行。像topvi这种不能放到后台运行,没有数据输入,没办法运行呀。

实例

# 后台压缩文件
$ tar -cJf big_data.tar.xz /home
[1] 3038

第二种

    第二种将工作放到后台执行的方法,当前台还没执行完的工作,堵塞了shell,无法进行其他操作。这个时候可以输入CTRL + Z,作业就是转到后台执行。但使用这种方法转到后台执行的工作状态会由“正在执行”变成“已停止”。

实例

$ top
CTRL + Z
[1]+  已停止

查看工作状态:jobs

    jobs命令可以查看前台处于后台的工作有多少,以及其对应的工作状态。

基本语法

jobs [参数]

参数说明

参数 说明
-l 列出进程的pid
-r 只显示正在运行的工作
-s 只显示已停止的工作

实例

# 显示所有正在后台运行的工作,以及其pid
$ jobs -l
[1]   3061 Stopped                 ./a.sh
[2]   3065 Stopped                 ./a.sh
[3]-  3066 Stopped                 ./a.sh
[4]+  3067 Stopped                 ./a.sh

    细心的同学会发现,列表中,有些作业是有+,有些作业带了-

    +号代表最近一个放入后台的工作,也是工作恢复时默认恢复的工作。-号代表倒数第二个放入后台的工作,而第三个以后的工作就没有+-标志了。

将后台的工作转到前台运行:fg

    fg命令用于把后台工作恢复到前台执行。

基本语法

fg %工作id

    其中,%可以省略,如果连工作id也省略,那么jobs命令会恢复作业id后面有+号的工作。

实例

# 将工作id是2的工作转到前台执行
fg 2

将后台停止工作的工作恢复执行:bg

    前面介绍过,正在前台执行的工作,通过快捷键CTRL + Z转到后台运行的时候,工作转到后台的同时,工作状态也会转为停止,那么就可以通过bg命令,将工作在后台恢复执行。

基本语法

bg %工作id

    bg的用法跟fg的用法很像。这里的%同样是可以省略的。

实例

# 将工作id是4的工作恢复在后台执行
$ bg 4
[1]+ ./a.sh &

杀掉后台工作:kill

    不管后台的工作处于什么状态,都可以通过kill命令将后台的工作杀掉。

    要特别注意,使用kill命令结束后台工作的时候,工作id前面的%不能省略哦,不然工作id就会被当作进程ID处理了。

基本语法

kill -signal %工作id

参数说明

signal 说明
-1 重新读取一次参数的配置文件 (类似 reload)
-9 立刻强制删除一个工作
-15 以正常的程序方式终止一项工作

实例

# 杀掉工作id是2的工作
kill -9 %2

脱离终端运行:nohup

    前面演示的,将工作放到后台运行,都是在bash的后台,如果用户退出登陆bash也跟着结束了,那么后台的工作也会全都没有了。nohub命令会有自己的日志文件nohup.out,命令执行的日志都放在这个日志文件里面。

基本语法

nohup [指令与参数] &

    注意,这里的&表示此命令会在终端后台工作;反之,如果没有&,则表示此命令会在终端前台工作。

实例

# 将自己写的脚本,放到后台运行
$ nohup ./a.sh &
nohup: 忽略输入并把输出追加到'nohup.out'
posted @ 2022-05-02 22:54  zaza_h  阅读(40)  评论(0编辑  收藏  举报