工作管理(job control) 是用在bash环境下的
也就是说,当我们登入系统取得bash shell之后,在单一终端机接口下同时进行多个工作的行为管理。
举例:我们在登入bash后,想要一边复制文件、一边进行资料搜寻、一边进行编译、还可以一边进行vim程序撰写。当然我们可以重复登入那六个文字接口的终端机环境中,但是我们其实是能在一个bash内达成的!这就是job control了
防止意外:
(/etc/security/limits.conf里可以设定使用者同时可以登入的联机数,如果我们被设定仅能以一个联机来工作,就不得不使用job control的模式。)
1. job control的注意事项
注意: 进行工作管理的行为中,其实每个工作都是目前bash的子进程,亦即彼此之间是有相关性的。我们无法以job control的方式由tty1的环境去管理tty2的bash(这个概念先建立起来)。
要进行bash的job control必须要注意到的限制是
- 这些工作所触发的进程必须来自于你shell的子进程(只管理自己的bash)
- 前景: 你可以控制与下达指令的这个环境称为前景的工作(foreground)
- 背景:可以自行运作的工作,你无法使用contrl+c终止他,可使用bg/fg呼叫该工作
- 背景中“执行”的进程不能等待 terminal/shell 的输入(input)
2. job control的管理
知识背景
bash 只能够管理自己的工作而不能管理其他bash的工作,所以即使你是root也不能够将别人的bash底下的job给他拿过来执行。此外,又分前景与背景,然后背景里面的工作状态又可以分为 暂停 stop 与 运作中 running.
2.1 直接将指令丢到背景中 执行的 &
假如我们要将 /etc/整个目录备份成为 /tmp/etc.tar.gz,便可以直接在命令行中输入: tar -zpcf /tmp/etc.tar.gz /etc &
(工作模式:tar -zpcf 压缩文件目录及名称 待压缩目录的路径及名称
)
其中
[1]
为工作号码(job number)与bash的控制有关14432
是该指令所触发的PID然后我们可以忽略它得继续操作bash
任务完成后的提示:
图片表示 job [1]已经完成,而接在其后的一串指令列即 工作指令。
插播
zip
的使用(和tar
类似)
- 压缩用zip
zip -r /tmp/etc.zip /etc
(zip -r 压缩文件路径 待压缩目录)
翻译成人话:将/etc目录压缩成 etc.zip,放置在/tmp目录下(-r 表示递归压缩子目录下所有文件)- 解压缩用unzip
unzip -d /tmp etc.zip
zip -d 解压缩到的路径 压缩文件名称
翻译成人话:将etc.zip解压缩到/tmp目录下(-d 表示解压缩到的目录,默认当前路径下)
不过,需要注意的是
在背景当中执行的指令,如果有 stdout 及 stderr 时,他的数据依旧是输出到屏幕上面,而由于是背景工作,通过[ctrl]+c
也无法停止程序。因此在进行此类工作时,最佳的状况就是利用数据流重导向,将输出数据传送到某个文件中。
例如👆,如此一来,输出信息都传送到 /tmp/log.txt了。
2.2 将“目前”的工作丢到背景中“暂停”:[ctrl]-z
在vim的一般模式下,如果我们需要到bash环境下进行搜寻,此时不需要结束vim,直接 [ctrl] -z即可将他丢到背景中等待。
参考如下鸟哥的解释:
不同于 前面提到的
&
将程序丢到背景里,在预设的情况下,使用[ctrl-z]丢到背景当中的工作都是“暂停”的状态。
2.3 观察目前的背景工作状态:jobs
如果我们想知道有什么工作在背景中,就用jobs
这个指令。
一般来说,我们直接在命令行中输入jobs
就可以了,不过它还有一些参数,可以根据需求添加
工作模式:jobs [-lrs]
选项与参数:
-
-l
:除了列出 job number 与指令串之外,同时列出PID的号码 -
-r
:仅列出正在背景 run 的工作 -
-s
:仅列出正在背景当中暂停(stop) 的工作
解释一下 job number 后面的 “+” “-”符号:
+代表最近被放到背景的工作号码
- 代表最近最后第二个被放到背景中的工作号码
超过最后第三个以后的工作,就不会有+/-符号存在了
这里的意义在于:就像👆图中的情况,如果我们直接输入fg
时(fg是 “将背景工作拿到前景来处理” 的命令) ,那个伴随"+"的job[2]会被预设拿到前景中来处理
2.4 将背景工作拿到前景来处理 : fg(foreground)
- 工作模式:
fg %jobnumber
- 选项与参数
%jobnumber
jobnumber为工作号码(数字) ## 注意,那个%是可有可无的
2.5 让工作在背景下的状态变成运作中:bg
鸟哥在下面这个图中讲得很详细,工作模式和fg相同
2.6 管理背景当中的工作 kill
如果我们想要将工作移除,可以使用kill这个命令,当然它还有一些参数来作为辅助
工作模式:kill -signal %jobnumber
常见参数介绍
-l
注意这里是L的小写,列出目前kill能够使用的参数有哪些
-1
重新读取一次参数的配置文件
-2
代表与由键盘输入 [ctrl] -c 同样的动作
-9
立刻强制删除一个工作
-15
以正常的进程方式终止一项工作。与-9不一样
想要了解signal的更多信息:man 7 signal
去查询相关资料
这里解释一下kill -9
和 kill -15
,当然推荐大家都使用 kill -15
,如果是迫不得已再使用kill -9
。因为有的进程在运行过程中会产生一些文本,kill -15
在kill进程时会将与进程相关的一切(包括中间生成的文本)一并删除。而kill -9
会强制得将工作移除掉,而一些中间产物会继续存在文件系统里。
注意:kill 后面接的数字默认是PID,如果想要管理bash的工作控制,必须使用
kill -signal %jobnumber
的形式(不同于fg
)
3. 脱机管理问题
很多小伙伴刚接触linux时,会把 &
放到背景中运行的模式当作放到系统的背景去,这么理解就错了。
我们之前在“工作管理”中提到的“背景”指的是bash的背景(也就是说,指的是在终端机模式下可以避免ctrl -c中断的一个情景),而不是放到系统的背景去。如果不好理解,举个例子:如果你是以远程联机的方式连接到你的Linux主机(terminal 或 putty),并且以&的方式放到背景去,如果工作尚未结束你就exit脱机了,你放在bash背景中的未完成的工作就会被中断的。
那该怎么办呢?如果我的工作需要进行一大段时间(>24h),总不能一直守着自己的终端机,开着远程联机软件肉眼看着吧。对于这种情况,我们可以将工作放置在系统背景,这样就与终端机无关了。
因此,这种情况我们可以使用at
和 nohup
3.1 nohop
nohup
可以让你在脱机或注销系统后,还能够让工作继续进行,它的工作模式
nonhup [指令与参数] 命令 &
这样就可以在系统背景中运行
3.2 at
at
这个指令通常是用在仅执行一次的工作排程里(将某些工作排进进程表中,在指定的时间执行)。当然,由于涉及系统安全问题,不是每个人都可以使用at的。查看/etc/at.allow(可以使用的名单) 和 /etc/at.deny(不可以使用的名单)两个文件,如果两个文件都不存在,那么只有root可以使用at这个命令。
- at 的运作方式
使用at这个指令来产生所要运作的工作,实质上,是将待运行的工作以文本的方式写入/var/sool/at/目录内。通过这种方式,便能通过atd这个服务,进行工作的取用与执行。
- at 的工作管理
atq
查询目前主机上有多少at工作排程
atrm (jobnumber)
删除错误的命令