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表达式(注意空格不能少) ...
随机推荐
- Java并发包中CyclicBarrier的工作原理、使用示例
1. CyclicBarrier的介绍与源码分析 CyclicBarrier 的字面意思是可循环(Cyclic)使用的屏障(Barrier).它要做的事情是,让一组线程到达一个屏障(也可以叫同步点)时 ...
- .NET实现Office Excel自定义公式 广泛应用于报表与数据分析
在管理软件开发的功能点中,有相当一部分功能是与Excel做数据交互,产生Excel 数据报表.如果Excel报表的数据计算方法很有规律可循,则可以通过自定义公式来解决.比如常见的资产负债表,利润表,取 ...
- BrowserSync前端调试工具使用
上次介绍了一款DebugGap移动端调试工具DebugGap推荐.但是这几天使用了之后感觉还是有些不足,尤其是里面的调试工具虽然和Chrome里面的调试长的很像,但是多少有些不同,使用起来还是不太方便 ...
- 利用JSDOC快速生成注释文档,非常棒。
有时往往我们需要建一个文档来记录js中的一些代码注释,比如一些公共的函数,又或者一些类,在团队合作中,文档接口也是必不可少的,传统的方式多少有些不便,这里介绍一个工具,它叫JSDOC,它可以用来将注释 ...
- Nokia Lumia通过电脑来升级Windows Phone 8.1
现在基本上所有lumia都推送了WP 8.1了,不过,有些朋友说在更新过程中常常断线,导致要重新下载.不知道是不是我的人品比较正能量,我从预览版升级,到正式版升级,都没有出现断网现象,每次都能顺利更新 ...
- 深入理解javascript作用域系列第四篇——块作用域
× 目录 [1]let [2]const [3]try 前面的话 尽管函数作用域是最常见的作用域单元,也是现行大多数javascript最普遍的设计方法,但其他类型的作用域单元也是存在的,并且通过使用 ...
- AIX下tar解包问题
今天,在AIX下安装tomcat,上传的版本是apache-tomcat-6.0.41.tar.gz,但用tar解压时出现以下问题: # tar xvf apache-tomcat-6.0.41.ta ...
- Express框架使用以及数据库公共操作类整理(Win7下的NodeJs)
具体步骤: 1.安装开发工具WebStorm: 2.安装node/npm(下载地址:https://nodejs.org/download/)选择适合你的xxx.mis安装: 3.安装express框 ...
- Sql Server,如何去含有非数字的nvarchar,再转为为数值
菜鸟一枚,今天做项目时,突然遇到一个问题: 在数据库中中存放的nvarchar类型的“时间”,例如:‘08:00’,而我需要进行时间的范围比较,这时就想到了将nvarchar类型转化为int类型. 这 ...
- SQL Server安全(7/11):使用跨数据库所有权链接(Cross-Database Ownership Chaining)的跨数据库安全
在保密你的服务器和数据,防备当前复杂的攻击,SQL Server有你需要的一切.但在你能有效使用这些安全功能前,你需要理解你面对的威胁和一些基本的安全概念.这篇文章提供了基础,因此你可以对SQL Se ...