mirror of
https://github.com/LCTT/TranslateProject.git
synced 2025-02-28 01:01:09 +08:00
发布:10 Linux/Unix Bash and KSH Shell Job Control Examples
This commit is contained in:
parent
874024b4c4
commit
51f792e233
@ -1,22 +1,22 @@
|
||||
10个 Linux/Unix下 Bash和KSH shell 的作业控制实例
|
||||
10个 Linux/Unix下 Bash 和 KSH shell 的作业控制实例
|
||||
================================================================================
|
||||

|
||||
|
||||
Linux 和 Unix 属于多任务的操作系统,也就是说一个系统在同一时间段内能运行多重任务(进程)。在这个新的博客系列,我将会列出相关的 Linux和Unix作业控制的命令,你可以通过这些命令在 Bash 或 Korn 还有 POSIX shell 下实现执行多重任务。
|
||||
Linux 和 Unix 属于多任务的操作系统,也就是说一个系统在同一时间段内能运行多重任务(进程)。在这个新的博客系列,我将会列出相关的 Linux 和 Unix 作业(job)控制的命令,你可以通过这些命令在 Bash 或 Korn 还有 POSIX shell 下实现执行多重任务。
|
||||
|
||||
### 什么是作业控制?###
|
||||
|
||||
作业控制不过是能够停止/挂起(stop/suspend)正在执行的进程(命令)也可以继续/唤醒(continue/resume)你需要的每一个进程来执行。这完全可以用你的操作系统和类似 bash/ksh 或 POSIX shell 完成。
|
||||
作业控制不只是能够停止/挂起(stop/suspend)正在执行的进程(命令),也可以继续/唤醒(continue/resume)执行你需要的每一个进程。这完全可以用你的操作系统和 bash/ksh 之类的 shell 或 POSIX shell 完成。
|
||||
|
||||
### 谁提供给了作业控制的设施条件 ###
|
||||
### 谁给作业控制的提供了环境? ###
|
||||
|
||||
Bash / Korn shell,或者是 POSIX shell 提供给了作业控制的设施条件。
|
||||
Bash / Korn shell,或者是 POSIX shell 提供给了作业控制的环境。
|
||||
|
||||
### 跟作业表打个招呼吧 ###
|
||||
|
||||
你的 shell 会留有一张当前作业的表单,称为作业表。当你键入命令时,shell 会给它分配一个 jobID(也称作 JOB_SPEC)。一个 jobID 或 JOB_SPEC只是很小的整数数值。
|
||||
|
||||
#### #1: 创建你的首个 Linux/Unix 作业(job) ####
|
||||
#### #1: 创建你的首个 Linux/Unix 作业 ####
|
||||
|
||||
我要运行一个名为 xeyes 的命令,它会在屏幕上显示两个椭圆的眼睛,输入:
|
||||
$ xeyes &
|
||||
@ -42,48 +42,47 @@ Bash / Korn shell,或者是 POSIX shell 提供给了作业控制的设施条件
|
||||
xload &
|
||||
sleep 100000 &
|
||||
|
||||
#### #2: 列出当前的jobs ####
|
||||
#### #2: 列出当前的作业 ####
|
||||
|
||||
To [see the status of active jobs in the current shell][1], type:
|
||||
要[查看当前 shell 的激活的任务状态][1],输入:
|
||||
|
||||
$ jobs
|
||||
$ jobs -l
|
||||
|
||||
输出样例:
|
||||
输出如下:
|
||||
|
||||
[1] 9379 Running xeyes &
|
||||
[2] 9380 Running gedit /tmp/hello.c &
|
||||
[3]- 9420 Running xload &
|
||||
[4]+ 9421 Running sleep 100000 &
|
||||
|
||||
A brief description of each field is given below:
|
||||
简要描述如下:
|
||||
|
||||
(注:表格部分,这样发表出来应该会方便看一点)
|
||||
<table border="1"><tbody><tr><th>字段</th><th>值</th><th>描述</th><th>示例</th></tr><tr><td>1</td><td>[1]</td><td><strong>jobID</strong> 或 <strong>JOB_SPEC</strong> - 工作号要与fg, bg, wait, kill和其他shell命令一起使用。你必须在工作号前缀添加一个百分号。(<kbd><strong>%</strong></kbd>).<br>加号 (<kbd>+</kbd>) 标识着默认的或是现在的 job。<br>减号 (<kbd>-</kbd>) 标识着先前的 job。</td><td><kbd>%1</kbd><br><kbd>fg %1</kbd><br><kbd>kill %2</kbd></td></tr><tr><td>2</td><td>9379</td><td><strong>进程 ID</strong> - 系统自动为每个进程创建并分配地独有的身份标志号。</td><td>kill 9379</td></tr><tr><td>3</td><td>Running</td><td><strong>状态</strong> - 关于 job 的状态:<br><kbd><strong>Running</strong></kbd> - 该 job 正在运行,还没有被外部信号挂起。<br><kbd><strong>Stopped</strong></kbd> - 该 job 已经被挂起。<br></td><td>N/A</td></tr><tr><td>4</td><td>xeyes &</td><td><strong>command</strong> - 由shell给出的命令。</td><td>script &<br>firefox url&</td></tr></tbody></table>
|
||||
<table border="1"><tbody><tr><th>字段</th><th>值</th><th>描述</th><th>示例</th></tr><tr><td>1</td><td>[1]</td><td><strong>jobID</strong> 或 <strong>JOB_SPEC</strong> - 工作号要与fg, bg, wait, kill和其他shell命令一起使用。你必须在工作号前缀添加一个百分号:(<kbd><strong>%</strong></kbd>)。<br>加号 (<kbd>+</kbd>) 标识着默认的或是现在的作业。<br>减号 (<kbd>-</kbd>) 标识着前一个作业。</td><td><kbd>%1</kbd><br><kbd>fg %1</kbd><br><kbd>kill %2</kbd></td></tr><tr><td>2</td><td>9379</td><td><strong>进程 ID</strong> - 系统自动为每个进程创建并分配地独有的身份标志号。</td><td>kill 9379</td></tr><tr><td>3</td><td>Running</td><td><strong>状态</strong> - 关于作业的状态:<br><kbd><strong>Running</strong></kbd> - 该 作业正在运行,还没有被外部信号挂起。<br><kbd><strong>Stopped</strong></kbd> - 该作业已经被挂起。<br></td><td>N/A</td></tr><tr><td>4</td><td>xeyes &</td><td><strong>command</strong> - 由shell给出的命令。</td><td>script &<br>firefox url&</td></tr></tbody></table>
|
||||
|
||||
你也可以用 ps 命名列出当前系统正在运行的进程:
|
||||
|
||||
$ ps
|
||||
|
||||
#### #3: 停止或挂起正在运行的jobs ####
|
||||
#### #3: 停止或挂起正在运行的作业 ####
|
||||
|
||||
按下[Ctrl]-[Z]键或使用[kill 命令][2],如下所示:
|
||||
|
||||
kill -s stop PID
|
||||
|
||||
举个例子,启动[ping 命令][3],然后用 Ctrl-Z 键触发停止 ping 命令的job:
|
||||
举个例子,启动[ping 命令][3],然后用 Ctrl-Z 键来停止 ping 命令作业:
|
||||
|
||||
[][5]
|
||||
*Animated gif 01: 挂起 ping 命令的 job*
|
||||
*Animated gif 01: 挂起 ping 命令作业*
|
||||
|
||||
#### #4: 在前台恢复 挂起的/停止的 job ####
|
||||
#### #4: 在前台恢复 挂起的/停止的作业 ####
|
||||
|
||||
让我们[恢复处于停止状态下的 job 回到前台运行][6],要实现这个目标当前 job 必须借助[fg 命令][7]。具体语法如下:
|
||||
让我们[恢复处于停止状态下的作业,让它回到前台继续运行][6],要将其变成当前作业,必须借助[fg 命令][7]。具体语法如下:
|
||||
|
||||
## ping 命令的作业号的值为5 ##
|
||||
fg %5
|
||||
|
||||
我也可以规定命令行开端符合字符串"ping"的 job[译注:不能出现不明确的字符串,例如如果后台有两个 vim 进程而你敲入 fg %vim 会报错。]:
|
||||
我也可以规定命令行开端符合字符串"ping"的作业[译注:不能出现不明确的字符串,例如如果后台有两个 vim 进程而你敲入 fg %vim 会报错。]:
|
||||
|
||||
## %String ##
|
||||
fg %ping
|
||||
@ -95,13 +94,13 @@ A brief description of each field is given below:
|
||||
64 bytes from www.cyberciti.biz (75.126.153.206): icmp_req=5 ttl=53 time=267 ms
|
||||
^C
|
||||
|
||||
#### #5: 在后台恢复 挂起/停止状态的 job ####
|
||||
#### #5: 在后台恢复 挂起/停止状态的作业 ####
|
||||
|
||||
在这个例子中,我将要使用[yum 命令][8]更新所有安装在 Redhat 或 CentOS Linux 生产服务器上的软件包并置于后台作业。
|
||||
在这个例子中,我使用[yum 命令][8]更新所有安装在 Redhat 或 CentOS Linux 生产服务器上的软件包并置于后台作业。
|
||||
|
||||
# yum -y update &>/root/patch.log &
|
||||
|
||||
然而,由于一些原因(例如,过载问题)我决定停止这个 job 20分钟:
|
||||
然而,由于一些原因(例如,过载问题)我决定停止这个作业20分钟:
|
||||
|
||||
# kill -s stop %yum
|
||||
|
||||
@ -111,7 +110,7 @@ A brief description of each field is given below:
|
||||
|
||||
#### 用 bg 重启停止在后台的 yum 进程 ####
|
||||
|
||||
现在,我将要[恢复停止的 yum -y update &>/root/patch.log & job][9],键入:
|
||||
现在,我将要[恢复停止的 yum -y update &>/root/patch.log & 作业][9],键入:
|
||||
|
||||
# bg %7
|
||||
|
||||
@ -131,17 +130,17 @@ A brief description of each field is given below:
|
||||
|
||||
或者
|
||||
|
||||
# kill pid
|
||||
# kill 进程ID
|
||||
|
||||
输出样例:
|
||||
|
||||
[7]+ Terminated yum -y update &>/root/patch.log &
|
||||
|
||||
在 Linux/FreeBSD/OS X Unix 下你可以[使用 killall 命令通过名字杀死进程或是 jobID 而不是通过 PID][12]
|
||||
在 Linux/FreeBSD/OS X Unix 下你也可以[使用 killall 命令通过名字杀死进程或是 jobID 而不是通过 PID][12]
|
||||
|
||||
#### #7 为什么当我登出后 shell 会清除我的所有后台 jobs ####
|
||||
#### #7 为什么当我登出后 shell 会清除我的所有后台作业 ####
|
||||
|
||||
在这个例子中,我将会启动 pdfwriter.py 来生成[这个站点][13]散装地 pdf 文件:
|
||||
在这个例子中,我将会启动 pdfwriter.py 来批量生成[这个站点][13]的 pdf 文件:
|
||||
|
||||
~/scripts/www/pdfwriter.py --profile=faq --type=clean --header=logo\
|
||||
--footer-left "nixCraft is GIT UL++++ W+++ C++++ M+ e+++ d-" \
|
||||
@ -153,14 +152,14 @@ A brief description of each field is given below:
|
||||
$ disown
|
||||
$ exit
|
||||
|
||||
#### #8 使用一个名为 nohup 的外部命令阻止在登出时杀死 job ####
|
||||
#### #8 使用一个名为 nohup 的外部命令阻止在登出时杀死作业 ####
|
||||
|
||||
你也可以使用[nohup 命令在你退出 shell 后执行 jobs][15]:
|
||||
你也可以使用[nohup 命令在你退出 shell 后执行作业][15]:
|
||||
|
||||
$ nohup ~/scripts/www/pdfwriter.py --profile=faq .... &
|
||||
$ exit
|
||||
|
||||
#### #9: 查找最后 job 的 PID ####
|
||||
#### #9: 查找最后的作业的 PID ####
|
||||
|
||||
为了查找最近在后台执行的(异步)命令的进程ID,可使用 bash shell 的特殊参数 $!
|
||||
|
||||
@ -171,9 +170,9 @@ A brief description of each field is given below:
|
||||
|
||||
最近在后台执行的job 的PID - 9421
|
||||
|
||||
#### #10: 等候 job 完成 ####
|
||||
#### #10: 等候作业完成 ####
|
||||
|
||||
wait 命令会等候给予的进程ID 或 作业ID,然后报告它的终止状态。语法如下:
|
||||
wait 命令会等候给予的进程ID 或 作业ID指定的进程,然后报告它的终止状态。语法如下:
|
||||
|
||||
/path/to/large-job/command/foo &
|
||||
wait $!
|
||||
@ -217,7 +216,7 @@ wait 命令会等候给予的进程ID 或 作业ID,然后报告它的终止状
|
||||
|
||||
#### Linux 和 Unix 作业控制命令总结列表 ####
|
||||
|
||||
<table border="1"><tbody><tr><th>命令</th><th>描述</th><th>示例</th></tr><tr><td><kbd><strong>&</strong></kbd></td><td>将 job 置入后台</td><td><kbd>命令 &</kbd></td></tr><tr><td><kbd><strong>%n</strong></kbd></td><td>设置作业号为 n (数字)的 job</td><td><kbd>命令 %1</kbd></td></tr><tr><td><kbd><strong>%Word</strong></kbd></td><td>引用命令行开端包含 Word 的 job</td><td><kbd>命令 %yum</kbd></td></tr><tr><td><kbd><strong>%?Word</strong></kbd></td><td>引用命令行包含 Word 的 job</td><td><kbd>命令 %?ping</kbd></td></tr><tr><td><kbd><strong>%%</strong></kbd><br><kbd><strong>%+</strong></kbd></td><td>引用当前 job</td><td><kbd>kill %%<br>kill %+</kbd></td></tr><tr><td><kbd><strong>%-</strong></kbd></td><td>引用先前 job</td><td><kbd>bg %-</kbd></td></tr><tr><td><kbd><strong>CTRL-Z</strong><br><kbd><strong>kill -s stop jobID</strong></kbd></kbd></td><td>挂起或停止 job</td><td><kbd>kill -s stop %ping</kbd></td></tr><tr><td><kbd><strong>jobs</strong><br><kbd><strong>jobs -l</strong></kbd></kbd></td><td>列出活动的 jobs</td><td><kbd>jobs -l</kbd></td></tr><tr><td><kbd><strong>bg</strong></kbd></td><td>将 jobs 置入后台</td><td><kbd>bg %1<br>bg %ping</kbd></td></tr><tr><td><kbd><strong>fg</strong></kbd></td><td>将 job 置入前台</td><td><kbd>fg %2<br>fg %apt-get</kbd></td></tr></tbody></table>
|
||||
<table border="1"><tbody><tr><th>命令</th><th>描述</th><th>示例</th></tr><tr><td><kbd><strong>&</strong></kbd></td><td>将作业置入后台</td><td><kbd>命令 &</kbd></td></tr><tr><td><kbd><strong>%n</strong></kbd></td><td>设置作业号为 n (数字)的作业</td><td><kbd>命令 %1</kbd></td></tr><tr><td><kbd><strong>%Word</strong></kbd></td><td>引用命令行开端包含 Word 的作业</td><td><kbd>命令 %yum</kbd></td></tr><tr><td><kbd><strong>%?Word</strong></kbd></td><td>引用命令行包含 Word 的作业</td><td><kbd>命令 %?ping</kbd></td></tr><tr><td><kbd><strong>%%</strong></kbd><br><kbd><strong>%+</strong></kbd></td><td>引用当前作业</td><td><kbd>kill %%<br>kill %+</kbd></td></tr><tr><td><kbd><strong>%-</strong></kbd></td><td>引用先前作业</td><td><kbd>bg %-</kbd></td></tr><tr><td><kbd><strong>CTRL-Z</strong><br><kbd><strong>kill -s stop jobID</strong></kbd></kbd></td><td>挂起或停止作业</td><td><kbd>kill -s stop %ping</kbd></td></tr><tr><td><kbd><strong>jobs</strong><br><kbd><strong>jobs -l</strong></kbd></kbd></td><td>列出活动的作业</td><td><kbd>jobs -l</kbd></td></tr><tr><td><kbd><strong>bg</strong></kbd></td><td>将 作业置入后台</td><td><kbd>bg %1<br>bg %ping</kbd></td></tr><tr><td><kbd><strong>fg</strong></kbd></td><td>将作业置入前台</td><td><kbd>fg %2<br>fg %apt-get</kbd></td></tr></tbody></table>
|
||||
|
||||
#### 关于 shell 内置命令和外部命令的小注 ####
|
||||
|
||||
@ -252,7 +251,7 @@ wait 命令会等候给予的进程ID 或 作业ID,然后报告它的终止状
|
||||
|
||||
via: http://www.cyberciti.biz/howto/unix-linux-job-control-command-examples-for-bash-ksh-shell/
|
||||
|
||||
译者:[Luoxcat](https://github.com/Luoxcat) 校对:[校对者ID](https://github.com/校对者ID)
|
||||
译者:[Luoxcat](https://github.com/Luoxcat) 校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创翻译,[Linux中国](http://linux.cn/) 荣誉推出
|
||||
|
Loading…
Reference in New Issue
Block a user