Bash基础——工作管理(Job control)
注:1.这里说的Bash不单纯的指Bash,泛指shell
2.这里的后台指的是Bash下面避免任务(Jobs)被Ctrl+C中断的一种场景,与我们说的deamon那种后台工作的进程不是一个概念,注意区分。
简介
Bash工作管理是指在Bash界面下同时进行多个工作任务的管理。举例来说:登陆 bash 后, 你可以一边复制文件、一边进行数据搜寻、一边编译程序、一边编写程序等等,这些任务都是Bash的子进程。Bash工作管理只能管理自己Bash下面的工作,不能把别人Bash下面的工作拿到自己Bash下执行,即使你是root也不行。但是root可以在这个Bash下干死在另一个Bash下的进程(参考:Is it possible to kill another user's process using sudo privileges?)。同理,你也不能由tty1的Bash去管理tty2的Bash。
前台和后台
后台工作的任务不可以等待terminal的输入,即不能与用户交互。同时后台的jobs也没法Ctrl+C暂停。使用jobs可以查看后台有哪些任务,以及他们当前的状态(Stopped、Running)。把后台任务拿到前台继续运行,使用fg命令;后台Stopped状态的任务继续运行,使用bg命令;对于删除后台任务,或重启后台任务等更复杂的操作,则借助Linux信号机制实现。下面对关键命令做解释。
把任务直接丢到后台运行
后台运行最大的好处就是可以不被Ctrl+C终端,但是对于后台任务的stdout和stderr还是会输出到前台影响前台显示。举例:yum -y install qemu-kvm &
虽然我把安装命令放到后台执行,但是安装过程输出还是会显示在屏幕上。通常的做法是把stdout和stderr重定向到日志文件,后台任务执行过程中输出信息在日志文件中查看。演示如下
tar -zpcvf /tmp/etc.tar.gz /etc > /tmp/log.txt 2>&1 &
在任务最后加&表示本次任务直接丢到后台,执行的时候前台会显示当前任务编号以及任务PID
这个任务的意思是:解压etc.tar.gz到指定目录,stdout和stderr都从定向到log.txt
暂停任务
想象这样一种场景,我正在vi passwd文件,突然先看看主机名是什么,于是我暂停vi操作。去编辑hostname问价,vi hostname后,我有暂停出去vi resolv.conf,还没编辑完,我又暂停。此时我总共暂停了3个任务。使用jobs可以查看后台任务。
jobs
选项与参数:
-l :除了列出 job number 与命令串之外,同时列出 PID 的号码;
-r :仅列出正在背景 run 的工作;
-s :仅列出正在背景当中暂停 (stop) 的工作。
[root@localhost etc]# jobs [1] Stopped vi /etc/passwd (wd: ~) [2]- Stopped vi hostname [3]+ Stopped vi /etc/resolv.conf
很显然,我这3个任务都是Stopped状态。
后台工作拿到前台处理
上面有3个Stopped的任务,使用fg可以将后台暂停任务拿到前台继续运行。
fg
选项与参数:
%jobnumber :jobnumber 为工作号码(数字)。注意,那个 % 是可有可无的!
+:运行前面有+号的那个任务
-:运行前面有-号的那个任务
后台暂停任务继续运行
如果后台暂停任务不拿到前台运行,在后台也是可以继续运行的,使用bg命令
bg
选项与参数:
%jobnumber :jobnumber 为工作号码(数字)。注意,那个 % 是可有可无的!
更复杂的操作
对于后台任务,如果想执行删除或者重启操作,就要借助Linux信号机制。使用kill个后台任务发信号
signal
kill -signal %jobnumber
选项与参数:
-l :这个是 L 的小写,列出目前 kill 能够使用的讯号 (signal) 有哪些?
-1 :重新读取一次参数的配置档 (类似 reload);
-2 :代表与由键盘输入 [ctrl]-c 同样的动作;
-9 :立刻强制删除一个工作;
-15:以正常的程序方式终止一项工作。与 -9 是不一样的。
任务脱机管理
如果你是以远程连线方式连接到你的 Linux 主机,并且将任务以 & 的方式放到后台执行, 请问,在任务尚未结束的情况下你离线了,该工作还会继续进行吗?答案是『否』!不会继续进行,而是会被中断掉。
如果有个任务要执行一个月,你难道不吃不喝等他一个月吗?当然不是
Linux下例行工作命令at可以解决这个问题,nohup命令也可以解决这个问题
语法如下
nohup [命令与参数] <==在终端机前景中工作
nohup [命令与参数] & <==在终端机背景中工作