Chinaunix首页 | 论坛 | 博客
  • 博客访问: 313489
  • 博文数量: 84
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 890
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-13 16:46
文章分类

全部博文(84)

文章存档

2017年(2)

2016年(4)

2015年(78)

我的朋友

分类: 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必须要注意到的限制是:

  1. 这个工作所触发的进程必须来自于你shell的子进程,只管理自己的bash
  2. 前台:你可以控制与执行命令的的这个环境称为前台foreground的工作
  3. 后台,可以自行运行的工作,你无法使用ctrl+c终止它,可使用bg/fg调用工作;
  4. 后台中"执行"的进程不能等待terminal/shell的输入input
  5. bash只能管理自己的工作job不能管理其他bash的工作,所以即使你是root也不能够将别人的bash下面的job给他拿过来执行。


(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命令查看的。

阅读(1552) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~