作业管理:jobs
工作管理
    像前面学到的vi、top等命令,都是占用了整个shell,只能等结束操作vi或者top才能进行其他操作。又或者说,一个压缩或者一个解压缩消耗了太长的时间。导致要等它完成才能进行其他操作。又或者后面学到通过源码编译的方法编译安装软件,特别是编译gcc,等几个小时。那么现在就来学习一下,怎样可以在一个shell上面进行多作业管理。
    由于假设我们只有一个终端接口,因此在可以出现提示字符让你操作的环境就称为前台(foreground),至于其他工作就可以让你放入后台 (background) 去暂停或运行。要注意的是,放到后台的工作想要运行时, 他必须不能够与使用者互动。举例来说, vim 绝对不可能在背景里面执行 (running)的!因为你没有输入数据他就不会跑啊! 而且放入背景的工作是不可以使用 CTRL + c 来终止的!
    总结一下,使用bash来进行工作管理,有以下几个注意事项:
- 这些工作所触发的程序必须来自于当前自己的 shell 的子程序
- 可以控制与下达指令的这个环境称为前台工作
- 可以自行运行的工作,你无法使用CTRL + c终止他,可使用 bg/fg 调用该工作
- 在后台中“执行”的程序不能等待 terminal/shell 的输入
后台运行的两种方法
第一种
    第一种将工作放到后台执行的方法,是在命令的最后面加上  &。这样按下回车键之后,工作就会进入到后台运行。像top、vi这种不能放到后台运行,没有数据输入,没办法运行呀。
实例
# 后台压缩文件
$ tar -cJf big_data.tar.xz /home
[1] 3038
第二种
    第二种将工作放到后台执行的方法,当前台还没执行完的工作,堵塞了shell,无法进行其他操作。这个时候可以输入CTRL + Z,作业就是转到后台执行。但使用这种方法转到后台执行的工作状态会由“正在执行”变成“已停止”。
实例
$ top
CTRL + Z
[1]+  已停止
查看工作状态:jobs
    jobs命令可以查看前台处于后台的工作有多少,以及其对应的工作状态。
基本语法
jobs [参数]
参数说明
| 参数 | 说明 | 
|---|---|
| -l | 列出进程的pid | 
| -r | 只显示正在运行的工作 | 
| -s | 只显示已停止的工作 | 
实例
# 显示所有正在后台运行的工作,以及其pid
$ jobs -l
[1]   3061 Stopped                 ./a.sh
[2]   3065 Stopped                 ./a.sh
[3]-  3066 Stopped                 ./a.sh
[4]+  3067 Stopped                 ./a.sh
    细心的同学会发现,列表中,有些作业是有+,有些作业带了-。
    +号代表最近一个放入后台的工作,也是工作恢复时默认恢复的工作。-号代表倒数第二个放入后台的工作,而第三个以后的工作就没有+-标志了。
将后台的工作转到前台运行:fg
    fg命令用于把后台工作恢复到前台执行。
基本语法
fg %工作id
    其中,%可以省略,如果连工作id也省略,那么jobs命令会恢复作业id后面有+号的工作。
实例
# 将工作id是2的工作转到前台执行
fg 2
将后台停止工作的工作恢复执行:bg
    前面介绍过,正在前台执行的工作,通过快捷键CTRL + Z转到后台运行的时候,工作转到后台的同时,工作状态也会转为停止,那么就可以通过bg命令,将工作在后台恢复执行。
基本语法
bg %工作id
    bg的用法跟fg的用法很像。这里的%同样是可以省略的。
实例
# 将工作id是4的工作恢复在后台执行
$ bg 4
[1]+ ./a.sh &
杀掉后台工作:kill
    不管后台的工作处于什么状态,都可以通过kill命令将后台的工作杀掉。
    要特别注意,使用kill命令结束后台工作的时候,工作id前面的%不能省略哦,不然工作id就会被当作进程ID处理了。
基本语法
kill -signal %工作id
参数说明
| signal | 说明 | 
|---|---|
| -1 | 重新读取一次参数的配置文件 (类似 reload) | 
| -9 | 立刻强制删除一个工作 | 
| -15 | 以正常的程序方式终止一项工作 | 
实例
# 杀掉工作id是2的工作
kill -9 %2
脱离终端运行:nohup
    前面演示的,将工作放到后台运行,都是在bash的后台,如果用户退出登陆bash也跟着结束了,那么后台的工作也会全都没有了。nohub命令会有自己的日志文件nohup.out,命令执行的日志都放在这个日志文件里面。
基本语法
nohup [指令与参数] &
    注意,这里的&表示此命令会在终端后台工作;反之,如果没有&,则表示此命令会在终端前台工作。
实例
# 将自己写的脚本,放到后台运行
$ nohup ./a.sh &
nohup: 忽略输入并把输出追加到'nohup.out'
混迹IT行业多年,技术依然渣渣,故名zaza-h
记录和分享自己的学习历程,如果有错漏,请各路大神帮忙指正。也欢迎大家多多讨论,共同成长
本文来自博客园,作者:zaza_h,转载请注明原文链接:https://www.cnblogs.com/zaza-h/p/16217252.html
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号