日期:2014-05-16  浏览次数:20629 次

linux bg/fg/jobs命令学习

为了方便用户进行任务管理和控制,linux提供了bg/fg/jobs这几条命令来轻松调度任务。

从以下命令执行来看,可以知道bg/fg/jobs这几条命令都是linux shell的特殊内建命令。
所以在执行bg/fg/jobs这几条命令时,当前shell能够自己解释而不需要额外创建两个
child process来完成这件事。
$ which bg
$ which fg
$ which jobs
$ whereis bg
bg:
$ whereis fg
fg:
$ whereis jobs
jobs:
$ type bg
bg is a shell builtin
$ type fg
fg is a shell builtin
$ type jobs
jobs is a shell builtin

当你在linux shell下执行一条很耗时的命令或程序时,
比如使用grep命令全盘递归搜索"strlen"这个字符串,
$ grep -nrws "strlen" ./
这可能会导致linux shell被占用很长时间,而此时如果用户想要使用shell做另外一件事,
难道必须要等到上一件事做完?
针对这个问题,有两种对应的办法:
1. 使用组合键CTRL+Z将当前shell中正在进行的任务丢到后台并暂停执行,这时用户
可以重新得到shell;
^Z
[1]+ Stopped             grep --color -nrws "wpa_supplicant" ./
2. 在执行耗时的任务时,将任务直接放到后台执行,
$ grep -nrws "strlen" ./ &
这样任务就一直会在后台运行。

问题1:使用的是grep命令,可是CTRL+Z暂停之后为什么是grep --color?
猜测可能是别名的原因,使用alias命令查看:
$ alias
...
alias grep='grep --color'
...
果然如猜测那样。关于alias命令,可以参考下面这篇博文:
http://blog.csdn.net/boyxulin1986/article/details/11891067

2. 如何确认后台中有哪些任务?
使用jobs命令可以查看后台中的任务:
$ jobs
[1]- Stopped             grep --color -nrws "wpa_supplicant" ./
[2]  Running             grep --color -nrws "wpa_supplican" ./
其中1/2是jobid,用户可以根据jobid来控制指定的任务运行。
请特别注意,jobid与PID是两个完全不相关的东西。

3. 后台正在运行的任务可以被暂停吗?
CTRL+Z无法暂停后台正在运行的任务。用户可以先将任务放到前台,再使用CTRL+Z
将其暂停并放入后台。
$ fg 2
grep --color -nrws "wpa_supplican" ./
^Z
[2]  Stopped             grep --color -nrws "wpa_supplican" ./
$ jobs
[1]- Stopped             grep --color -nrws "wpa_supplicant" ./
[2]+ Stopped             grep --color -nrws "wpa_supplican" ./

4. 如何运行暂停在后台的任务?
如果你希望继续在后台运行任务,使用bg命令并指定jobid,
$ bg 2
[2]+ grep --color -nrws "wpa_supplican" ./
如果你希望将后台任务(包括正在运行的任务和暂停的任务)放到前台运行,
使用fg命令并指定jobid,
$ fg 2
grep --color -nrws "wpa_supplican" ./
此时shell就被你的前台任务占领了。

曾经遇到过一个问题:
1. 我的程序修改了一些环境变量比如PATH/LD_LIBRARY_PATH等,然后将其运行在前台;
2. 使用CTRL+Z将我的程序暂停并放入后台;
3. 在shell下面测试已经暂停的程序。
会出现因为找不到shared library从而导致程序无法运行等问题。
后来经过确认发现,原来是因为前后台的环境(环境变量不一样所导致)不一样引起的。

1楼boyxulin1986昨天 12:20
自己必须顶自己