工作管理
1. 什是工作管理
这个工作管理 (job control) 是用在 bash 环境下的,也就是说:“当我们登陆系统取得 bash shell 之后,在单一终端机接口下同时进行多个工作的行为管理 ”。举例来说,我们在登陆 bash 后, 想要一边复制文件、一边进行数据搜寻、一边进行编译,还可以一边进行 vim 程序 撰写!
2. job control的管理
2.1. 背景执行
直接将指令丢到背景中“执行”的 &
# 在后面加上 & 表示该程序在后台执行
tar -zpcf /tmp/etc.tar.gz /etc &
# [1] 表示job number 14432为PID
[1] 14432
#当程序执行完成后突然会显示下列内容
#[1]表示job number 与上面的一致 Done已完成
[1]+ Done tar -zpcf /tmp/etc.tar.gz /etc
ctrl+z 将正在前台执行的任务放在后台,并且会暂停
2.2. jobs
jobs
选项:
-l 在正常信息基础上列出进程号
-n 仅列出上次通告之后改变了状态的进程
-p 仅列出进程号
-r 仅列出正在背景run的工作
-s 仅列出正在背景当中暂停stop的工作
示例:
[root@study ~]# jobs -l
[1]- 14566 Stopped vim ~/.bashrc
[2]+ 14567 Stopped find / -print
# [1]是job number ,14566是PID
注:+ 代表最近被放到背景的工作号码, - 代表最近最后第二个被放置到背景中的工作号 码。 而超过最后第三个以后的工作,就不会有 +/- 符号存在了。
2.3. fg
将背景工作拿到前景来处理
bg: bg %[jobs number]
示例:
[root@study ~]# jobs -l
[1]- 14566 Stopped vim ~/.bashrc
[2]+ 14567 Stopped find / -print
[root@study ~]# fg #默认取出+标识的任务,并前台执行
[root@study ~]# fg + #取出+标识的任务,并前台执行
[root@study ~]# fg - #取出-标识的任务,并前台执行,如果没有-标识的任务,则执行+标识的任务
[root@study ~]# fg %1 # 直接取出jobs号码为1的任务,这里%可以忽略
2.4. bg
让工作在背景下的状态变成运行中
bg %[jobs number]
[root@study ~]# jobs -l
[1]- 14566 Stopped vim ~/.bashrc
[2]+ 14567 Stopped find / -print
[root@study ~]# bg #默认取出+标识的任务,并后台执行
[root@study ~]# bg + #取出+标识的任务,并后台执行
[root@study ~]# bg - #取出-标识的任务,并后台执行,如果没有-标识的任务,则执行+标识的任务
[root@study ~]# bg %1 # 直接取出jobs号码为1的任务(这里%可以忽略)并后台执行
2.5. kill
管理背景当中的工作
kill [选项] [任务编号/PID] # 前面有%的是任务编号(%1),没有%的为PID(如:14321)
选项:
-s sig SIG 是信号名称
-n sig SIG 是信号编号
-l 列出信号名称;如果参数后跟 `-l'则被假设为信号编号,而相应的信号名称会被列出
几个常用的
-1 :重新读取一次参数的配置文件 (类似 reload);
-2 :代表与由键盘输入 [ctrl]-c 同样的动作;
-9 :立刻强制删除一个工作;
-15:以正常的程序方式终止一项工作。与 -9 是不一样的。
注:智能使用-s或-n中的一个不能同时使用
-s -n 中 s或n可以直接忽略使用信号编号或者型号名称代替
示例:
jelly@jelly-linux:~/文档$ jobs
[1] 已停止 find /
[2] 已停止 vim test
[3] 已停止 vim test2
[4]- 已停止 vim test3
[5]+ 已停止 vim test4
# 删除任务1
jelly@jelly-linux:~/文档$ kill -n 9 %1
[1] 已停止 find /
jelly@jelly-linux:~/文档$ jobs
[1] 已杀死 find / #状态以改变
[2] 已停止 vim test
[3] 已停止 vim test2
[4]- 已停止 vim test3
[5]+ 已停止 vim test4
# 删除任务2
jelly@jelly-linux:~/文档$ kill -9 %2
[2] 已停止 vim test
jelly@jelly-linux:~/文档$ jobs
[2] 已杀死 vim test
[3] 已停止 vim test2
[4]- 已停止 vim test3
[5]+ 已停止 vim test4
# 删除任务3
jelly@jelly-linux:~/文档$ kill -SIGKILL %3
[3] 已停止 vim test2
jelly@jelly-linux:~/文档$ jobs
[3] 已杀死 vim test2
[4]- 已停止 vim test3
[5]+ 已停止 vim test4
2.6. killall
信号量与kill中的相同,唯一区别是killall是根据指令名称去发送信号量,可能会多个程序响应这个信号量。
3. 离线管理问题
我们在工作管理当中提到的“背景”指的是在终端机模式下可以避免 [crtl]-c 中断 的一个情境, 你可以说那个是 bash 的背景,也就是说这里的背景依赖当前的bash,并不是放在系统中,,如果以远端连线方式连接到Linux主机,并且将工作以 & 的方式放到背景去,当shell连接断开时这个任务也会被关闭,应为它依赖的bash被关闭了。
当遇到这种问题解决方式:
-
使用at将工作放在系统背景中去执行
-
使用nohup
nohup 并不支持 bash 内置的指令,因此你 的指令必须要是外部指令才行
评论区