Linux作业控制

来源:互联网 发布:丁丁长度知乎 编辑:程序博客网 时间:2024/05/29 02:46

作业控制指的是控制正在运行的进程的行为。比如,用户可以挂起一个进程,等一会儿再继续执行该进程。shell将记录所有启动的进程情况,在每个进程过程中,用户可以任意地挂起进程或重新启动进程。作业控制是许多shell(包括bashtcsh)的一个特性,使用户能在多个独立作业间进行切换。通常,在命令行输入的命令都在前台运行,并且持续运行于前台直至结束,除非按下Ctrl+CCtrl+\组合键来发送信号终止它。通过作业控制,可以将一个作业置于后台运行,可以通过Ctrl+D组合键暂停一个作业,这样作业将被发送到后台并挂起,可以使一个暂停的作业在后台运行,可以将一个后台作业送回前台,甚至还可以终止已经在后台或前台运行的作业。
        
一般而言,进程与作业控制相关联时,才被称为作业。
        
在大多数情况下,用户在同一时间只运行一个作业,即它们最后向shell键入的命令。但是使用作业控制,用户可以同时运行多个作业,并在需要时在这些作业间进行切换。这会有什么用途呢?例如,当用户编辑一个文本文件,并需要中止编辑做其他事情时,利用作业控制,用户可以让编辑器暂时挂起,返回shell提示符开始做其他的事情。其他事情做完以后,用户可以重新启动挂起的编辑器,返回到刚才中止的地方,就象用户从来没有离开编辑器一样。这只是一个例子,作业控制还有许多其他实际的用途。
下面我们来做个实验更加深入了解:
[root@centos ~]# vim 123
先用vim编辑一个文件123,此时在编辑到一半的时候按下^Z(Ctrl+Z)后将暂停vim会话:
[1]+  Stopped                 vim123
[root@centos ~]#
此时出现了shell提示符,vim进程被挂起至后台,接下来我们敲入以下一些命令:
[root@centos ~]# sleep 200&
[2] 10410
[root@centos ~]# jobs
[1]+  Stopped                 vim123
[2]-  Running                 sleep200 &
[root@centos ~]# jobs -l
[1]+ 10400 Stopped                 vim123
[2]- 10410Running                 sleep200 &
[root@centos ~]# jobs %%
[1]+  Stopped                 vim123
[root@centos ~]#
注解:sleep 200&命令是继vim 123以后的第二条命令,标准输出中的[2]是指这是第二个运行在后台的作业,他的进程号是10410。此时输入jobs命令可以查看当前后台的作业以及它们的状态,挂起还是正在运行,jobs -l选项可以显示在后台运行的进程(作业)和它们的进程号PIDjobs命令加%%参数可以显示最近一条放入作业表中的命令。

[root@centos ~]# fg %1
vim 123
注解:fg命令后跟一个%1是指把作业号为1的作业调到前台,vim会话被调到了前台,可以继续编辑123文件了,如果不加作业号1fg将把最近放到后台的作业调回前台运行。
[root@centos ~]# jobs -x echo %1
10444
[root@centos ~]# kill %1
注解:jobs -x echo %1命令中-x选项表示只答应作业的pid号,%1表示作业号。kill %1表示把作业号作为参数来终止进程。

++++++++++++++++++++++++++++++命令解析++++++++++++++++++++++++++++
bg      
启动被终止的后台作业,使被挂起到后台的作业在后台继续运行
fg       
将后台作业调到前台
jobs   
列出所有正在运行的作业
kill      
向指定作业发送kill信号
stop   
挂起一个后台作业
stty tostop  
当一个后台作业向终端发送输出时就挂起它
wait [n]        
等待一个指定的作业并返回它的退出状态,这里n是一个PID或作业号
^Z(Ctrl-Z)    
终止(挂起)作业。屏幕上将出现提示符
以上命令都可以通过加%n(n为作业号)来控制作业。
jobs
命令的参数
%n            
作业号n
%string     
string开头的作业名
%?string   
作业名包含string
%%           
当前作业
%+            
当前作业
%-             
当前作业前的一个作业
-r               
列出所有运行的作业
-s              
列出所有挂起的作业

Ctrl+Z
在我们的日常工作中,我们可以用 CTRL-z来将当前进程挂起到后台暂停运行,执行一些别的操作,然后再用 fg来将挂起的进程重新放回前台(也可用 bg来将挂起的进程放在后台)继续运行。这样我们就可以在一个终端内灵活切换运行多个任务,这一点在调试代码时尤为有用。因为将代码编辑器挂起到后台再重新放回时,光标定位仍然停留在上次挂起时的位置,避免了重新定位的麻烦。
但是还有一个问题,这种方法的操作对象是作业,如果我们在运行命令时在结尾加了”&”来使它成为一个作业并在后台运行,那么就万事大吉了,我们可以通过jobs命令来得到所有作业的列表。但是如果并没有把当前命令作为作业来运行,如何才能得到它的作业号呢?答案就是用 CTRL-z(按住Ctrl键的同时按住z键)了!
CTRL-z
的用途就是将当前进程挂起(Suspend),然后我们就可以用jobs命令来查询它的作业号,再用bg来将它放入后台并继续运行。需要注意的是,如果挂起会影响当前进程的运行结果,请慎用此方法。
其他一些控制组合键:
Ctrl-c Kill foreground process kill
前台进程
Ctrl-d Terminate input, or exit shell
停止输入,或退出shell和命令exit效果一样
Ctrl-s Suspend output
暂停输出
Ctrl-q Resume output
恢复输出
Ctrl-o Discard output
Ctrl-l Clear screen

disown 内置命令
disown
命令可以使一个正在运行中的作业忽略HUP信号
disown -h %n
来使某个作业n忽略HUP信号。
disown -ah     
来使所有的作业都忽略HUP信号。
disown -rh      
来使正在运行的作业忽略HUP信号。

 

 

0 0
原创粉丝点击