Bash中的任务(job)管理
本来不准备写这篇博客的,因为任务管理(job管理)非常非常常用,以至于觉得根本没有必要去写这样一个东西。但想了下,还是记录一下吧,也许有人会用到呢。
不知你是否碰到过这样的情况,当你兴致勃勃的打开VIM,写代码写到正酣时,运营MM或者产品MM气喘吁吁的跑过来:“赶紧帮我跑一下xx的数据,一会做PPT要用”。可是不想直接关闭当前的VIM,而且某些系统下,又不能新开tty(如设置了maxlogins参数)去执行这些任务,这可怎么办?这其实就涉及到了任务(job)管理。
那么什么是任务管理?顾名思义,就是指在Bash中对同一个tty中的多个工作进行添加、删除、处理等。由于Bash中的每个工作实际上是当前Bash的子进程,因此,从根本上说,job管理就是指对进程的管理。注意上述的表述中,使用了“同一个tty”这一字眼,这时因为,我们是无法通过tty1的job管理去管理tty2中的job的。例如,我们在tty3终端通过ctrl+z将vim放置到后台暂停,在当前tty中,通过jobs命令查看到的后台任务列表如下图所示:

而这时登录新的tty,通过jobs命令查看,发现并没有jobs位于后台:

1. 通过ctrl+z方式将job抛到后台
刚才我们已经看到了,在vim编辑的过程中,通过ctrl+z快捷键的方式,可以将当前VIM放入后台暂停,同时tty终端会输出如下字样的提示:
[]+ Stopped vim
其中[1]指的是job的编号,在之后将工作放置到前台,或者杀死后台进程的时候会用到。
Stopped代表当前进程的状态(实际上,通过ctrl+z方式放置到后台的job默认都是Stopped状态),vim指的是被放置到后台的job。等等,那个加号+是什么意思?如果我们再放置2个job到后台,通过jobs命令查看当前后台的jobs列表,输出如下:

发现不仅有+号,还有-号。其实+号指输入fg命令时,默认会将标识为+号的job取到前台来执行,-号则是+号job被fg之后的备胎。
2. 将命令丢到后台执行 &
在Bash下,经常会做一些比较耗费时间的工作,比如读取log的脚本,可能需要10分钟以上才能完成,总不能一直盯着吧?这时,最好的办法在命令后面加上&,将其放入后台执行
作为测试,我们在test.php中输入如下内容:
<?php
$i = 0;
while($i++ < 30){
echo $i;
sleep(1);
}
然后将其抛入后台执行:

我们看到,即使是在后台执行,程序的输出还是会输出到Bash的标准输出,即使你按了CTRL+C也不会有任何作用。这可以通过重定向解决:
php test.php >& >>test.log &
通过jobs命令查看jobs的状态:

跟刚才的几乎一样,除了这次抛入后台的是Running状态。在任务执行完毕之后,屏幕会输出如下字样:

表明当前工作已经完成。
3. 将后台工作拿到前台来处理 fg (%jobnumber)
前面只讲了如何将工作放置到后台以及如何查看后台jobs状态。现在数据跑完了,运营MM走了,继续打开刚才后台的vim编码吧。这需要用到fg命令
命令格式:fg [%jobnumber] . 其中[]中的内容可省,这时默认取出的是标识为+的job.如果要取出指定的job,需要传入job编号:
fg %
即可取出编号为1的job
4. 让工作在后台的状态变成运行中 bg (% jobnumber)
我们知道,通过CTRL+Z放置放置到后台的job,默认是Stopped状态的,如果要让进程在后台执行,应该怎么做呢?bg命令就是干这个的。
再次执行2中的脚本,不过这次在执行后,我们立即按下CTRL+Z使之暂停。jobs查看状态:

标号为3的job即是我们刚刚加入的。
执行bg %3
再次查看jobs:

可以看到,job已经由Stopped状态编程Running状态,并且命令后面多了一个&
5. 杀死后台的工作 kill
现在,后台的进程多了起来,如果有些job不需要执行了,放在后台总归是不好的。这时,可以通过kill命令删除后台的jobs. 命令格式:Kill – signal %jobnumber
这与kill杀死一般的进程基本没什么区别,不同的是,这里是job的编号而不是进程的PID.
Signal是传入的信号,常用的有:
-l 列出kill的可用信号
-1 重新读取配置
-9 立即强制终止(不会有清理工作)
-15 正常终止一个job(会有一些后续的清理工作)。
为了保险起见,慎重使用-9参数。
最后,给几个hint:
(1). VIM编辑过程中ctrl+z暂停手头的工作,做一些其他的处理,是经常使用的操作。例如:为了防止修改的代码不小心被同步到线上去,我们常常需要check编辑的文件已经放入了rsync的ignore-list中。
(2). 通过&放置到后台的命令,虽然不会被CTRL+C中断,但是默认所有的输出都会输出到屏幕,这应该通过重定向来解决。如果输出的内容不需要或者忽略看,可以简单的重定向到/dev/null设备。
(3). 如果一个脚本执行的时间较长,简单放入后台不管可能会因为TTY中断而导致job中断(即使是在后台,tty中断的情况下,job也会中断的)。这时可以通过nohup命令将运行脚本放置到系统的后台而不是当前tty的后台,该命令类似于:
nohup php test.php >& &
现在,享受job管理带来的便利吧。
Bash中的任务(job)管理的更多相关文章
- Bash 中的 $0 在什么时候不是 argv[0]
每个 C 程序都有一个 main 函数,每个 main 函数都有一个 argv 参数,这个参数是一个字符串数组,这个数组的值是由该 C 程序的父进程在通过 exec* 函数启动它时指定的. 很多人说 ...
- ASP.NET Core 1.0 中的依赖项管理
var appInsights=window.appInsights||function(config){ function r(config){t[config]=function(){var i= ...
- bash中不可以用字符串做数组下标
bash中可以用字符串做数组下标吗例如 test["abc"]=1------解决方案-------------------- 好像是误会,是awk里可以,bash shell里不 ...
- Linux bash 中,如何将正常信息和错误信息输出到文件
问题描述: $ command 2>> error $ command 1>> output 是否有方法,在bash同一行,实现输出stderr到error文件,输出stdou ...
- bash 中的变量
bash 中的变量 Linux command line 笔记 变量无需声明,自动创建 var=abc #变量a赋值为字符串abc var="hello world" #字符串里有 ...
- Bash中的shopt选项
Bash中的shopt选项 http://blog.chinaunix.net/uid-20587169-id-1919110.html shopt命令用于显示和设置shell中的行为选项,通过这些选 ...
- bash中一些基础知识
bash是linux操作系统的shell.以下是Multi-Perspective Sentence Similarity Modeling论文实现时碰到的一个bash: #!/bin/bash py ...
- Bash中的位置参数和特殊参数
#Bash中的位置参数和特殊参数 #Bash中的位置参数是由0以外的一个或多个数字表示的参数.#位置参数是当Shell或Shell函数被引用时由Shell或Shell函数的参数赋值,并且可以使用Bas ...
- bash中的数值运算
第一种,使用((表达式)): a=3 ((b=a+2)) echo $b 第二种使用let: let "c=$a+4" echo $c 第三种,使用expr表达式(注意空格不能少) ...
随机推荐
- fir.im Weekly - 94 个 iOS 开发资源推荐
距离 2016 年还有 17 个日夜,而你和回家只隔了一张 12306 验证码的距离,祝大家抢票顺利.本期 fir.im Weekly 收集了一些优秀的 GitHub 源码.开发工具和动画特效,希望对 ...
- salesforce 零基础学习(三十六)通过Process Builder以及Apex代码实现锁定记录( Lock Record)
上一篇内容是通过Process Builder和Approval Processes实现锁定记录的功能,有的时候,往往锁定一条记录需要很多的限制条件,如果通过Approval Processes的条件 ...
- iOS-----Xcode-Debug尝试
在Xcode中,Debug时,不能像eclipse ,或VS那些集成开发那样,能直接查看变量的值.那怎么在调试的时候查看XCode的变量呢? 有一些方法的. 1.新建一个Single View App ...
- hadoop安装遇到的各种异常及解决办法
hadoop安装遇到的各种异常及解决办法 异常一: 2014-03-13 11:10:23,665 INFO org.apache.hadoop.ipc.Client: Retrying connec ...
- DOM_01之树及遍历
1.DOM:ECMAScript+DOM+BOM,Document Object Model,核心DOM+HTML DOM+XML DOM: 2.辨析:①HTML:专门编写网页内容的语言:②XHTML ...
- jqGrid实现当前页列合计与总计
当前页列合计 js代码如下: ... footerrow: true, gridComplete: function () { var rowNum = parseInt($(this).g ...
- JQuery学习之各种效果演示
1.隐藏与显示:hide()和show(),toggle() **隐藏: $("#hide").click(function(){ $("p").hide(); ...
- React 入门实例教程
现在最热门的前端框架,毫无疑问是 React . 上周,基于 React 的 React Native 发布,结果一天之内,就获得了 5000 颗星,受瞩目程度可见一斑. React 起源于 Face ...
- 总结整理 -- 爬虫技术(C#版)
爬虫技术学习总结 爬虫技术 -- 基础学习(一)HTML规范化(附特殊字符编码表) 爬虫技术 -- 基本学习(二)爬虫基本认知 爬虫技术 -- 基础学习(三)理解URL和URI的联系与区别 爬虫技术 ...
- Android基于mAppWidget实现手绘地图(七)–根据坐标添加地图对象
为了将地图对象放置到某个特殊的地理位置上,你需要: 1. 创建地图对象 2.添加地图对象到图层(任何位置) 3. 移动该地图对象,使用 MapObject.moveTo(Location locati ...