分类: LINUX
2015-07-17 21:07:15
(1)概念
这个工作管理(job control)是用在bash环境下的,也就是说,当我们登录系统取得bash shell之后,在单一终端机下同时进行多个工作的行为管理。在进行工作管理的行为中,其实每个工作都是目前bash的子进程,即彼此之间是有相关性的。
对于运行多个程序你当然可以选择在不同的终端中运行如tty1~7。只是有时处于安全或方便的原因,我们需要在单一终端下运行。
前台foreground:假设我们只有一个终端,可以出现提示符让你操作的环境就称为前台foreground
后台background:工作管理中的后台不是纯正的后台只是使用了&号,可以避免ctrl+c中断程序,工作管理的后台依旧与终端有关,在这种情况下,如果你是远程连接方式连接到你linux主机,并且将工作以&的方式放到后台去,如果网络终端,工作会停止,不会继续进行,而是会被中断掉;
放入后台的程序可以暂停或运行,但要注意的是,放入后台的工作想要运行时,他必须不能够与用户互动,也就是说需要互动的程序放入后台,那就必须暂停(stop)了。例如vim就绝对不能再后台里面执行(running),而且放入后台的工作是不可以使用ctrl+c来终止的。
总之进行bash的job control必须要注意到的限制是:
(2)直接将命令丢轨道后台中"执行"的&
cp file 1 file2 &
上面的命令重点在于那个&的功能,它表示将file1复制为file2,且放置与后台中执行,也就是说执行这一个命令之后,在这一个终端仍然可以做其他的工作。而当这一个命令cp file1 file2 执行完毕之后,系统将会在你的终端显示完成的信息,这是一个很重要的定义,例如你使用 ping 1.1.1.1 &那么系统总是提示你完成的信息,也就是通断情况,感觉好像是没有放入后台执行,此时屏幕的信息量很多,而且你没有办法使用ctrl+c来阻止他。除非你在开一个终端,或者exit退出系统,在重新登录,然后kill掉它。所以我们使用&命令时往往需要使用数据流重定向功能。
[root@localhost ~]# tar -zpcf /root/etc.tar.gz /etc & [1] 10095 #中括号内的号码表示工作号码[job number],10095表示这个工作在系统中的PID [root@localhost ~]# tar: 从成员名中删除开头的"/" tar: 从硬连接目标中删除开头的"/"
[1]+ Done tar -zcf /root/etc.tar.gz /etc #代表[1]这个工作已经完成Done [root@localhost ~]# |
在后台中执行的命令,如果有stdout集stderr时,它的数据依旧是输出到屏幕上面的。所以我们会服务看到提示符,当然也就无法完好第掌握前台工作,最佳的状况就是利用数据流重定向,将输出数据传送至某个文件,或/dev/null中。如
tar –zpcvf /tmp/etc.tar.gz /etc > /tmp/log.txt 2>&1 & ping 192.168.1.1 &> ~/ping.log & |
(3)将目前的工作丢到后台中"暂停"ctrl+z
这个功能挺简单的就是ctrl+z,例如你正在使用vi编辑脚本,突然想下一些系统信息,那么ctrl+z吧。
(4)查看目前的后台工作状态jobs
参数
-l:除了列出job number与命令串之外,同时列出PID的号码;
-r:running列出正在后台run的工作
-s:仅列出在后台当中暂停stop的工作
常用的就是jobs –l啦!
[root@RHEL6 ~]# jobs -l [1]- 3231 Stopped vim [2]+ 3233 Stopped vim [root@RHEL6 ~]# |
jobs –l可以显示job number,同时列出PID的号码,仔细看到那个+-号,+号代表默认的去用工作,如果目前我有两个工作在后台,而如果我仅输入fg,那么[2]所代表的工作会被拿到前台来处理。-代表最近最后第二个被放置到后台中的工作号码,而超过最后第三个以后的工作,就不会有+-符合存在了!
(5)将后台工作拿到前台来处理:fg
命令格式:fg %jobnumber
fg-则是代表将-号的那个工作号码拿到前台来处理。
(6)让工作在后台下的状态变成运行中:bg
命令格式:bg %jobnumber
(7)脱机管理问题
如果是为了远程连接linux主机,网络中断后还能继续执行,你可以使用at来处理,因为at是将工作放置到系统的后台,而与终端机无关。如果不想使用at的话,那你可以尝试使用nohup这个命令。这个nohup可以让你在脱机或者注销系统后,还能够让工作继续进行。
nohup [命令与参数] #在终端机前台工作
nohup [命令与参数] & #在终端机后台中工作,如果你想要让在后台工作在你注销后,还能继续执行,那么使用nohup搭配&是不错的运行情境。
nohup 并不支持bash内置的命令,因此你的命令必须要是外部命令才行,也就是使用type命令查看的。