这个工作管理 (job control) 是用在 bash 环境下的,也就是说:『当我们登入系统取得创建的 bash shell 进程之后,在该bush下同时进行多个工作的行为管理 』。 而所有创建的工作都是目前 bash 的子进程。
要进行 bash 的 job control 必须要注意到的限制是:
- 这些工作所触发的进程必须是你 shell 的子进程(只管理自己的 bash);
- 前台:在bash前台运行的工作 (foreground);
- 后台:在后台自行运作的工作,可使用 bg/fg 呼出该工作;
- 后台中『执行』的进程无法和用户交互
常用命令
直接将指令丢到后台中『执行』的 &
将『目前』的工作丢到后台中『暂停』: [ctrl]-z
观察目前的后台工作状态: jobs -l
将后台工作拿到前景来处理: fg %jobnumber
让工作在后台下的状态变成运作中: bg %jobnumber
关闭后台中的工作: kill -9 %jobnumber
脱机管理问题
如果你是以远程联机方式连接到你的 Linux 主机,并且将工作以 & 的方式放到后台去,在工作尚未结束的情况下你脱机了,该工作会被中断掉。
可以尝试使用 nohup 这个指令来处理喔!这个 nohup 可以让你在脱机或注销系统后,还能够让工作继续进行(nohup 并不支持 bash 内建的指令 )。语法:
[root@study ~]# nohup [指令与参数] &
例:
# 1. 先编辑一支会『睡着 500 秒』的程序: [root@study ~]# vim sleep500.sh #!/bin/bash /bin/sleep 500s /bin/echo "I have slept 500 seconds." # 2. 丢到后台中去执行,并且立刻注销系统: [root@study ~]# chmod a+x sleep500.sh [root@study ~]# nohup ./sleep500.sh & [2] 14812 [root@study ~]# nohup: ignoring input and appending output to `nohup.out' #会告知这个讯息! [root@study ~]# exit
如果你再次登入的话,再使用 pstree 去查阅你的进程,会发现 sleep500.sh 还在执行中!并不会被中断掉! nohup后的指令不会绑定到终端机, 脚本的输出会被导向『~/nohup.out 』