[Linux]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位于后台:

job控制

1.  通过ctrl+z方式将job抛到后台

  刚才我们已经看到了,在vim编辑的过程中,通过ctrl+z快捷键的方式,可以将当前VIM放入后台暂停,同时tty终端会输出如下字样的提示:

[1]+  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 2>&1 >>test.log &

通过jobs命令查看jobs的状态:

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

表明当前工作已经完成。

3.  将后台工作拿到前台来处理 fg (%jobnumber)

  前面只讲了如何将工作放置到后台以及如何查看后台jobs状态。现在数据跑完了,运营MM走了,继续打开刚才后台的vim编码吧。这需要用到fg命令

命令格式:fg [%jobnumber]  . 其中[]中的内容可省,这时默认取出的是标识为+的job.如果要取出指定的job,需要传入job编号:

fg %1

即可取出编号为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 2>&1  &

  现在,享受job管理带来的便利吧。

时间: 2024-10-10 14:34:52

[Linux]Bash中的任务(job)管理的相关文章

Linux bash 中,如何将正常信息和错误信息输出到文件

问题描述: $ command 2>> error $ command 1>> output 是否有方法,在bash同一行,实现输出stderr到error文件,输出stdout到output文件? 也就是,如何在bash的同一行,实现stderr和stdout重定向到不同的文件? 解决方法: 将它们放入同一行,command 2>> error 1>> output 然而,注意 >> 是如果文件有数据,会在文件尾部添加内容.而 > 将会重

Linux bash中的变量分类

1.本地变量 VAR=XYZ 2.局部变量 local VAR=XYZ 3.环境变量 在子shell中可以起作用 export VAR=XYZ 4.位置变量 $0 脚本名本身 $1 第一个参数 $2 第二个参数 ... ${10} 第十个参数 ${11} 第十一个参数 shift 依次向后移动参数 比如:分别显示第一.二.三个参数 !#/bin/bash echo $1 shift echo $1 shift echo $1 5.特殊变量 $? 脚本执行状态(0--正确,1-255错误,1/2/

linux 系统中多重操作系统引导管理器grub学习

注:以下学习均在X86架构的CPU下搭建完成的linux系统. 一.linux系统启动流程简介 POST开机自检-->加载BIOS-->读取MBR-->启动Boot Loader/Grub程序-->加载内核-->用户层init依据inittab文件来设定运行等级-->init进程执行rc.sysinit-->启动内核模块-->执行不同运行级别的脚本程序-->执行/etc/rc.d/rc.local-->执行/bin/login程序,进入登录状态

linux bash 中的重定向

在 linux 中,这些重定向都是等价的 $ file command arg1 arg2 arg3 $ command > file arg1 arg2 arg3 $ command arg1 > file arg2 arg3 $ command arg1 arg2 > file arg3 $ command arg1 arg2 arg3 > file

在Linux系详解Linux bash中的变量

(大讲台:国内首个it在线教育混合式自适应学习) 统中进行日常运维或者是编写脚本时,变量是再熟悉不过的了,但这些变量都有哪些类型,具体的用法又有哪些差异呢?本文整理分享给大家: 一.bash变量类型: 本地变量 局部变量 环境变量 位置变量 特殊变量(内置) 二.本地变量: varname=value:作用域为整个bash进程可以使用: 变量命名规范: 1. 只能含字母.数字和下划线,并且以字母和下划线开头 2. 最好不要跟系统已有的环境变量重名 3. 见名知意 三.局部变量: local va

Linux服务器中安装python包管理工具pip

pip是python的包管理工具,python的强大之处除了在于语法的简练,还有就是对众多的库支持了. 1.下载pip包管理工具 链接地址:https://pypi.python.org/pypi/pip/#downloads 2.winscp上传至服务器, 3.解压到服务器的某个目录: 4.安装完成: 接下来可以进行的安装python的各种第三方模块包了.

在Linux系统中文件(资源)和用户的管理

一个可执行二进制程序,被加载到内存,被内核调度到CPU上运行,这时候,就表现了一个进程.也可以说进程是程序的一个实例,是程序的动态表现. 在 Linux 系统中进程(process)是有属主的,也就是该进程以哪个用户的身份运行的.大家都知道,程序有输入和输出,也称这为程序IO.如果我们程序数据输入是磁盘.如,Web 服务器,接收用户的请求之后,把网页数据从磁盘中读入加工之后再把数据响应给用户.如果,发起Web 服务进程的用户没有读取该用户请求网页文件的权限.则无法响应用户的请求了.所以,文件(资

Linux中bash中的几种基础特性汇总!

首先需要知道什么是shell?如果将Linux内核当作一个地球的核心,那么shell就是地壳.shell本身也是一个应用程序,为我们提供了使用系统的接口.shell程序有很多种,目前主流发行版大多数默认使用bash,其次还有sh,tcsh,csh,fish等,其程序存储在/etc/shells目录下. 由于目前最常用的bash,所以就以bash为例来说一说bash的基础特性,偷偷说一句,其实我也是个新手,其他的shell并未接触,不敢轻易去说,当然本文中难免有错误,还请各位不吝赐教,让大家共同进

Linux系统中程序的安装及管理、创建私有yum仓库实验

各位小伙伴今天要和大家分享的是Linux系统中程序的安装及管理,以及创建私有yum仓库的操作实验.本次我们会从以下几个部分进行说明: Linux应用程序基础 查询RPM软件包信息 安装.升级.卸载.RMP软件包.yum仓库 源代码编译安装 应用程序与系统命令的关系:1.文件位置? 系统命令:一般在/bin和/sbin目录中? 应用程序:通常在/usr/local目录中2.主要用途? 系统命令:完成对系统的基本管理工作,例如IP配置工具? 应用程序:完成相对独立的其它辅助任务,例如网页浏览3.适用