10个 Linux/Unix下 Bash 和 KSH shell 的作业控制实例

Linux 和 Unix 属于多任务的操作系统,也就是说一个系统在同一时间段内能运行多重任务(进程)。在这个新的博客系列,我将会列出相关的 Linux 和 Unix 作业(job)控制的命令,你可以通过这些命令在 Bash 或 Korn 还有 POSIX shell 下实现执行多重任务。

什么是作业控制?

作业控制不只是能够停止/挂起(stop/suspend)正在执行的进程(命令),也可以继续/唤醒(continue/resume)执行你需要的每一个进程。这完全可以用你的操作系统和 bash/ksh 之类的 shell 或 POSIX shell 完成。

谁给作业控制的提供了环境?

Bash / Korn shell,或者是 POSIX shell 提供给了作业控制的环境。

跟作业表打个招呼吧

你的 shell 会留有一张当前作业的表单,称为作业表。当你键入命令时,shell 会给它分配一个 jobID(也称作 JOBSPEC)。一个 jobID 或 JOBSPEC只是很小的整数数值。

#1: 创建你的首个 Linux/Unix 作业

我要运行一个名为 xeyes 的命令,它会在屏幕上显示两个椭圆的眼睛,输入: $ xeyes &

输出样例:

Fig.01: 在后台运行 xeyes 命令

我使用&符号让一个 job 在后台运行。shell 会打印一行信息类似如下:


  1. [1] 6891

在这个例子中,有两个数字输出,分别表示:

  • 1 : 在后台执行的 xeyes 任务的作业号为 1。
  • 6891 : 作业1的进程ID。

我在多执行一些 job:


  1. ## 启动一个文本编辑器,X 的系统负载显示,和 sleep 命令 ##
  2. gedit /tmp/hello.c &
  3. xload &
  4. sleep 100000 &

#2: 列出当前的作业

查看当前 shell 的激活的任务状态,输入:


  1. $ jobs
  2. $ jobs -l

输出如下:


  1. [1] 9379 Running xeyes &
  2. [2] 9380 Running gedit /tmp/hello.c &
  3. [3]- 9420 Running xload &
  4. [4]+ 9421 Running sleep 100000 &

简要描述如下:

字段 描述 示例
1 [1] jobID 或 JOB_SPEC - 工作号要与fg, bg, wait, kill和其他shell命令一起使用。你必须在工作号前缀添加一个百分号:(%)。
加号 (+) 标识着默认的或是现在的作业。
减号 (-) 标识着前一个作业。
%1
fg %1
kill %2
2 9379 进程 ID - 系统自动为每个进程创建并分配地独有的身份标志号。 kill 9379
3 Running 状态 - 关于作业的状态:
Running - 该 作业正在运行,还没有被外部信号挂起。
Stopped - 该作业已经被挂起。
N/A
4 xeyes & command - 由shell给出的命令。 script &
firefox url&

你也可以用 ps 命名列出当前系统正在运行的进程:


  1. $ ps

#3: 停止或挂起正在运行的作业

按下[Ctrl]-[Z]键或使用kill 命令,如下所示:


  1. kill -s stop PID

举个例子,启动ping 命令,然后用 Ctrl-Z 键来停止 ping 命令作业:

Animated gif 01: 挂起 ping 命令作业

#4: 在前台恢复 挂起的/停止的作业

让我们恢复处于停止状态下的作业,让它回到前台继续运行,要将其变成当前作业,必须借助fg 命令。具体语法如下:


  1. ## ping 命令的作业号的值为5 ##
  2. fg %5

我也可以规定命令行开端符合字符串"ping"的作业[译注:不能出现不明确的字符串,例如如果后台有两个 vim 进程而你敲入 fg %vim 会报错。]:


  1. ## %String ##
  2. fg %ping

输出样例:


  1. 64 bytes from www.cyberciti.biz (75.126.153.206): icmp_req=3 ttl=53 time=265 ms
  2. 64 bytes from www.cyberciti.biz (75.126.153.206): icmp_req=4 ttl=53 time=249 ms
  3. 64 bytes from www.cyberciti.biz (75.126.153.206): icmp_req=5 ttl=53 time=267 ms
  4. ^C

#5: 在后台恢复 挂起/停止状态的作业

在这个例子中,我使用yum 命令更新所有安装在 Redhat 或 CentOS Linux 生产服务器上的软件包并置于后台作业。


  1. # yum -y update &>/root/patch.log &

然而,由于一些原因(例如,过载问题)我决定停止这个作业20分钟:


  1. # kill -s stop %yum

输出样例:


  1. [7]+ Stopped yum -y update &>/root/patch.log &

用 bg 重启停止在后台的 yum 进程

现在,我将要恢复停止的 yum -y update &>/root/patch.log & 作业,键入:


  1. # bg %7

或者:


  1. # bg %yum

输出样例:


  1. [7]+ yum -y update &>/root/patch.log &

#6: 杀死作业/进程

杀死yum 命令进程,输入如下kill 命令及其作业号 7:


  1. # kill %7

或者


  1. # kill 进程ID

输出样例:


  1. [7]+ Terminated yum -y update &>/root/patch.log &

在 Linux/FreeBSD/OS X Unix 下你也可以使用 killall 命令通过名字杀死进程或是 jobID 而不是通过 PID 

#7 为什么当我登出后 shell 会清除我的所有后台作业

在这个例子中,我将会启动 pdfwriter.py 来批量生成这个站点的 pdf 文件:


  1. ~/scripts/www/pdfwriter.py --profile=faq --type=clean --header=logo\
  2. --footer-left "nixCraft is GIT UL++++ W+++ C++++ M+ e+++ d-" \
  3. --footer-right "Page [of] of [total]" &

一旦当我登出shell时,pdfwriter.py 作业就会被我的 shell 杀死。为了克服这个问题需要使用shell的内置命令 disown 来告诉 shell 不要发送 HUP 信号,键入:


  1. $ ~/scripts/www/pdfwriter.py --profile=faq .... &
  2. $ disown
  3. $ exit

#8 使用一个名为 nohup 的外部命令阻止在登出时杀死作业

你也可以使用nohup 命令在你退出 shell 后执行作业:


  1. $ nohup ~/scripts/www/pdfwriter.py --profile=faq .... &
  2. $ exit

#9: 查找最后的作业的 PID

为了查找最近在后台执行的(异步)命令的进程ID,可使用 bash shell 的特殊参数 $!


  1. $ gedit foo.txt &
  2. $ echo "最近在后台执行的job 的PID - $!"

输出样例:


  1. 最近在后台执行的job 的PID - 9421

#10: 等候作业完成

wait 命令会等候给予的进程ID 或 作业ID指定的进程,然后报告它的终止状态。语法如下:


  1. /path/to/large-job/command/foo &
  2. wait $!
  3. /path/to/next/job/that-is-dependents/on-foo-command/bar

这是我的一个工作脚本:


  1. #!/bin/bash
  2. # A shell script wrapper to create pdf files for our blog/faq section
  3. ########################################################################
  4. # init() - Must be run first
  5. # Purpose - Create index file in $_tmp for all our wordpress databases
  6. ########################################################################
  7. init(){
  8. _php="/usr/bin/php"
  9. _phpargs="-d apc.enabled=0"
  10. _base="~/scripts"
  11. _tmp="$_base/tmp"
  12. _what="$1"
  13. for i in $_what
  14. do
  15. [[ ! -d "$_tmp/$i" ]] && /bin/mkdir "$_tmp/$i"
  16. $_php $_phpargs -f "$_base/php/rawsqlmaster${i}.php" > "$_tmp/$i/output.txt"
  17. done
  18. }
  19.  
  20. #####################################################
  21. # Without index file, we can out generate pdf files
  22. #####################################################
  23. init blog
  24.  
  25. ###########################################################
  26. # Do not run the rest of the script until init() finished
  27. ###########################################################
  28. wait $!
  29.  
  30. ## Alright, create pdf files
  31. ~/scripts/www/pdfwriter.py --profile=blog --type=clean --header=logo\
  32. --footer-left "nixCraft is GIT UL++++ W+++ C++++ M+ e+++ d-" \
  33. --footer-right "Page [of] of [total]"

Linux 和 Unix 作业控制命令总结列表

命令 描述 示例
& 将作业置入后台 命令 &
%n 设置作业号为 n (数字)的作业 命令 %1
%Word 引用命令行开端包含 Word 的作业 命令 %yum
%?Word 引用命令行包含 Word 的作业 命令 %?ping
%%
%+
引用当前作业 kill %%
kill %+
%- 引用先前作业 bg %-
CTRL-Z
kill -s stop jobID
挂起或停止作业 kill -s stop %ping
jobs
jobs -l
列出活动的作业 jobs -l
bg 将 作业置入后台 bg %1
bg %ping
fg 将作业置入前台 fg %2
fg %apt-get

关于 shell 内置命令和外部命令的小注

运行下面的 type 命令找出给予命令是否属于内部或外部的。


  1. type -a fg bg jobs disown

输出样式:


  1. fg is a shell builtin
  2. fg is /usr/bin/fg
  3. bg is a shell builtin
  4. bg is /usr/bin/bg
  5. jobs is a shell builtin
  6. jobs is /usr/bin/jobs
  7. disown is a shell builtin

在几乎所有情况下,你都需要使用 shell 的内置命令。所有外部命令例如 /usr/bin/fg 或 /usr/bin/jobs 工作在一个不同的 shell 环境下,而不能用在父 shell 的环境下。

总结

我希望你能喜欢这篇博文系列(rss 订阅),我建议你阅读下面的更多信息:

原文发布时间为:2014-03-13

本文来自合作伙伴“Linux中国”

时间: 2024-10-02 08:36:45

10个 Linux/Unix下 Bash 和 KSH shell 的作业控制实例的相关文章

《构建高可用Linux服务器 第3版》—— 3.5 汇总Linux/UNIX下的bash快捷键

3.5 汇总Linux/UNIX下的bash快捷键 在工作中发现,许多同事,尤其是PHP开发同事,基本不用Linux/UNIX下的快捷键,这严重影响了工作效率.所以我收集了一下CentOS 5.8及FreeBSD 8.1下bash中命令行的快捷键.以下快捷键在CentOS 5.8_x64.FreeBSD 8.1_x64下均可使用.另外,我在每条用法后加上了注释,帮助大家理解它们的作用. Ctrl+A:切换到命令行开始. 这个操作跟Home实现的结果一样,但Home在某些UNIX环境下无法使用,这

Linux/Unix下ODBC的安装、配置与编程

odbc|unix|编程 Linux/Unix下ODBC的安装.配置与编程 齐亮 (cavendish@eyou.com) 2002 年 7 月 本文主要内容是介绍ODBC的简单原理,以及如何在Linux/Unix下进行ODBC的安装.配置与编程. 一. ODBC原理 ODBC 是Open Database Connect 即开放数据库互连的简称,它是由Microsoft 公司于1991 年提出的一个用于访问数据库的统一界面标准,是应用程序和数据库系统之间的中间件.它通过使用相应应用平台上和所需

Linux/Unix 下调试动态库(.so文件)

问题描述 Linux/Unix 下调试动态库(.so文件) 需要调试一个C语言编写的动态库,这个动态库也是我自己写的编译的时候加了-g参数. 但是这个动态库是给oracle数据库调用的,也就是在存储过程里面调用这个动态库.由于这个动态库是新写的,经常有问题需要用gdb跟踪代码调试.我要怎么做才能调试这个动态库呢??? 目前想到的一个办法就是再写一个C程序调用这个动态库然后gdb调试.但是这个动态库提供给数据库的接口很多全部写出来比较费时间.希望找个方便点的方法,类似于gdb直接调试运行中的程序.

《PHP、MySQL和Apache入门经典(第5版)》一1.2 Linux/UNIX下的安装

1.2 Linux/UNIX下的安装 PHP.MySQL和Apache入门经典(第5版)尽管下面介绍的过程是在Ubuntu Linux系统上测试过的,但这些步骤对其他所有Linux或商业UNIX发布的默认安装都是一样的.在编译过程中,你可能遇到意外的错误信息,此时应联系系统管理员或参考自己特定的操作系统的文档. 如果你使用本书随书光盘中包含的XAMPP版本,请从这里开始,以超级用户启动(作为root登录或作为一个常规系统用户su登录),并在文件系统下用/mnt参数加载CD-ROM. 现在,你已经

Linux/Unix下安装Perl模块的两种方法分享_perl

方法一.手工安装的步骤 从CPAN下载了DBI模块1.13版的压缩文件DBI-1.13.tar.gz,假设放在/usr/local/src/下. cd /usr/local/src 解压缩这个文件: tar xvzf DBI-1.13.tar.gz 这时会新建一个DBI-1.13的目录. cd DBI-1.13 生成makefile: perl Makefile.PL 建立模块 make 测试模块 make test 如果测试结果报告"all test ok",您就可以放心地安装编译好

《PHP、MySQL和Apache入门经典(第5版)》一一1.2 Linux/UNIX下的安装

1.2 Linux/UNIX下的安装 PHP.MySQL和Apache入门经典(第5版)尽管下面介绍的过程是在Ubuntu Linux系统上测试过的,但这些步骤对其他所有Linux或商业UNIX发布的默认安装都是一样的.在编译过程中,你可能遇到意外的错误信息,此时应联系系统管理员或参考自己特定的操作系统的文档. 如果你使用本书随书光盘中包含的XAMPP版本,请从这里开始,以超级用户启动(作为root登录或作为一个常规系统用户su登录),并在文件系统下用/mnt参数加载CD-ROM. 现在,你已经

linux/unix下svn自动更新post-commit hook failed (exit code 255)

linux/unix下svn自动更新出错解决: post-commit hook failed (exit code 255) with no output. linux/unix下要实现svn提交后自动更新到测试服务器,添加hook即可/usr/svn/mulu/hooks/post-commit 不带后缀 设置权限为可执行 chmod 777 /usr/svn/baoming/hooks/post-commit   #!/bin/sh WEB="/usr/home/mulu" SV

Hiawatha 7.6发布 Linux/UNIX下安全的Web服务器

Hiawatha 7.6该版本SQL注入预防功能已被改写. Hiawatha是一个Linux/UNIX下安全的http://www.aliyun.com/zixun/aggregation/17117.html">Web服务器,其设计的最主要的目的就是安全,当然它也是快速且易于配置的. 主要功能: 请求方法 GET POST HEAD OPTIONS TRACE PUT DELETE HTTP状态码 200 OK 201 创建. 204 无内容 206 部分内容 301 永久移除 其他 访

Hiawatha v7.5发布 Linux/UNIX下安全的Web服务器

Hiawatha是一个Linux/UNIX下安全的http://www.aliyun.com/zixun/aggregation/17117.html">Web服务器,其设计的最主要的目的就是安全,当然它也是快速且易于配置的. 主要功能: 请求方法 GET POST HEAD OPTIONS TRACE PUT DELETE HTTP状态码 200 OK 201 创建. 204 无内容 206 部分内容 301 永久移除 其他 访问/连接控制 禁止 支持CGI(包含PHP) hiawath