Linux任务管理
1. job control
bash只能够管理自己的任务而不能管理其他bash的任务,即使是root的用户也不能够将别人bash下面的job拿过来执行。此外,后台的任务又可以分为暂停与运行状态。接下来说一下实际执行job控制的命令:
- 直接将命令丢到后台执行的
&
符号
将任务丢到后台执行,此时,要求任务不能与前台交互,且无法用<Ctrl + C>终止它。
此外,由于有些命令的执行会有大篇幅的输出,比如tar -zpcvf /tmp/etc.tar.gz /etc &> /tmp/log.txt
,会导致前台被输出信息弄得花花绿绿的,可以搭配nohup命令使用。
- 将[目前]的任务丢到后台中暂停:<Ctrl + Z>
将任务丢到后台暂停,比如我们第二次作业中的查看当前网段中有多少主机连通,由于ping的时间比较长,而且我们无法通过<Ctrl + C>中断程序的执行,script在子bash中执行,此实我们就可以通过<Ctrl + Z>将任务丢到后台中执行。
注意到输出格式为[job number] + PID status command
:
其中job number仅在当前bash中有效,+ 代表默认的使用任务。所以说:[如果目前我有多个任务在后台运行或暂停,而如果此时输入fg
命令,那么被+
标注的那个任务会被拿到前台中来处理]。
- 查看目前的后台任务状态:jobs
jobs 命令 选项详解:
-l 出了列出job number 与命令串之外,同时列出PID。
-r 列出后台正在run的任务(run)
-s 仅列出正在后台暂停的任务(stop)
-
将后台任务拿到前台处理:
fg
fg %jobnumber
其中%可有可无,推荐带上fg
取出默认任务fg -
拿出标号为-
的任务 -
将任务在后台下的状态变为运行中:
bg
注意bg
命令不是把前台任务移到后台运行,而是指将后台中暂停的任务变成运行状态。
可以看到,我们通过bg
命令和jobnumber
成功的将后台暂停的任务转变成了执行状态。
- 管理后台当中的任务:
kill
kill命令格式:kill -signal %jobnumber
kill -l
-l 列出目前kill所能用的所有信号
signal 代表给予后面接的那个任务什么样的指示
-1 重新读取一次参数的配置文件
-2 代表由键盘输入<Ctrl + C>同样的操作
-9 立即强制删除一个任务
-15 以正常的进程方式终止一项任务,后面我们会说-9和-15的差别
-9这个信号通常是在[强制删除一个不正常的任务]时所使用的,-15则是以正常步骤结束一项任务(15是默认值),两者并不一样,举个例子,加入以vim编辑一个文件,正常会产生一个.filename.swp
的文件。如果使用-15这个信号时,vim会尝试以正常的步骤结束vi的任务,所以.filename.swp
会被主动删除,而以-9命令来结束vi的执行时,.filename.swp
则不会被删除,还是会存在于文件系统之中。
然而在上面的这个例子中,应该先使用fg
来取回前台的控制权,然后再退出vim。因此,kill
其实是无法使用默认的-15信号来终止vim的,而且不建议使用-9信号。
Tips;可以使用man 7 siganl
查看kill支持的signal,做出对应的选择。
kill命令后面接的数字默认是PID,所以如果要写jobnumber,一定要记得带上%。
2. 脱机管理问题
以上所说的前台与后台都是针对你登录的bash而言,当你通过远程连接登录上bash后,如果你在你的后台任务还没执行完的过程中断开了远程连接,任务并不会在后台继续执行,而是会被中断。那么我们该怎么实现脱机后的任务继续执行呢?
这个时候可以考虑使用nohup
命令。注意,nohup是将任务挂在系统的后台,与你当前正在运行的bash并无关系,因此输出并不会输出到你所使用的bash上,而是会生成一个中间文件~/nohup.out
。当你再次敲几nohup.out的时候,才会给出提示信息。
nohup 命令用法:
nohup [命令与参数] 终端中的前台任务
nohup [命令与参数] & 终端中的后台任务