Linux作业管理
在介绍作业管理之前需要先知道,作业管理是在bash
环境下使用的。也就是说“当登入系统获取bash shell
之后,在单一终端界面下,同时管理多个作业”。这样应该了解到:管理作业时,其实每个作业都是当前bash
的子程序,即彼此之间是有关联的。我们无法以作业管理的方式由tty1
的环境去管理tty2
的bash
。
直接将命令放到后台“执行”的&
在bash
的环境下, 前台指:你可以控制的作业。后台指:在内存可以自行运行的作业,你无法直接控制它,除非以bg/fg
等命令将该作业调用出来。
范例:
[root@redflag ~]# tar –zpcf /tmp/etc.tar.gz /etc &
[1] 24874 <== [job number] PID
[root@redflag ~]# <==可以继续工作,不受影响。
这里job1
在后台继续工作,你可在前台继续操作linux
。过了一会,会突然出现这个数据:
[1] + Done tar –zpcf /tmp/etc.tar.gz /etc #这是表示[1]作业已经完成
该命令最大的好处就是不怕被“[Ctrl]+c”
这个中断指令来中断了
这里就会出现一个问题,如果上面的命令是
[root@redflag ~]# tar –zpcvf /tmp/etc.tar.gz /etc &
这时在后台执行的命令,如果有stdout
和stderr
时,它的数据是输出到屏幕上,所以我们无法看到提示符,也就无法完好地控制前台作业。所以,最好是使用数据流重导向,将输出数据传至某个文件中。我们可以这样做:
[root@redflag ~]# tar –zpcvf /tmp/etc.tar.gz /etc > tpm/log.txt 2>&1 &
这样,数据都传送到/tmp/log.txt
中,自然不会影响到前台作业。
将“当前”作业放到后台“暂停”:[crtl]+Z
如果你正在进行vi
,但你想查找某个文件,需要到bash
环境搜索。此时你可以暂时离开vi
[root@redflag ~]# vi ~/.bashrc # 在vi 的一般模式下,按ctrl+z
[1]+ Stopped /usr/bin/vim ~/.bashrc #(+)表示当前在后台下默认的作业
[root@redflag ~]# <== 获取了前台的控制权
观察当前后台作业状态:jobs
[root@redflag ~]# jobs [-lrs]
参数:
-l:除了列出作业号之外,同时列出PID
-r:仅列出正在后台运行的作业
-s:仅列出正在后台暂停的作业
范例:
[rot@redflag ~]# jobs –l
[1]+ 24988 Stopped /usr/bin/vim ~/.bashrc
[2]- 25006 Stopped /usr/bin/vim ~/.bash_history
一般来说,直接执行jobs
即可。在上面的输出中,有(+
-
)号。(+
)表示默认的作业。所以说“当前我有两个作业在后台,两个作业都是暂停的,如果我仅输入fg
时,那么[1]
会被拿到前台处理”
将后台作业拿到前台处理,fg
[root@redflag ~]# fg %jobnumber
范例:
[root@redflag ~]# jobs
[1]+ 24988 Stopped /usr/bin/vim ~/.bashrc
[2]- 25006 Stopped /usr/bin/vim ~/.bash_history
[root@redflag ~]# fg <==默认取出+的作业,即[1]
[root@redflag ~]# fg %2 <==直接规定取出的作业号码
作业在后台运行:bg
之前都是将作业放到后台去“暂停”,而bg
实现一个作业在后台运行。
[root@redflag ~]# find / -perm +7000
#此时,请立刻按ctrl+z暂停
[1]+ stopped find / -perm +7000
[root@redflag ~]#
[root@redflag ~]# jobs ; bg %1 ; jobs
[1]+ Stopped find / -perm + 7000
[1]+ find / -perm +7000 &
[1]+ Running find / -perm +7000 &
此时Stopped
变成了Running
,命令行的最后多了一个&
符号,表示该作业在后台启动了。
注意:1-5操作过程中“%jobnumber”
可以将“%”
省略直接加jobnumber
即可。
管理后台作业:kill
[root@redflag ~]# kill –signal %jobnumber
[root@redflag ~]# kill –l
参数:
-l:列出当前kill能够使用的信号(注意是小写L)
-1:重新读取一次参数的设置文件(类似reload) ---对应的信号为SIGHUP
-2:表示与由键盘输入ctrl+c同样的动作 ---对应的信号为SIGINT
-9:立刻强制删除一个作业 ---对应的信号为SIGKILL
-15:以正常方式终止一项作业 ---对应的信号为SIGTERM
[root@redflag ~]# jobs
[1]+ Stopped vim bashrc
[root@redflag ~]# kill -9 %1 #以强制方式删除
[1]+ 已删除 vim bashrc
[root@redflag ~]# kill –SIGTERM %1 #-SIGTERM与15是一样的
说明一下以正常方式与强制方式来终止作业的区别:例如,用vi
编辑文件的时候会产生一个.filename.swp
文件,如果以正常方式来结束作业,那么.filename.swp
文件会主动被删除;相反以强制的方式来结束作业,那么.filename.swp
文件会继续存在文件系统中。
注意:kill
可以帮我们将信号传送给某个作业(%jobnumber)
或者是某个PID
(直接输入数字),也就是说,kill
后面直接加数字与加上%
的情况是不同的。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。