找回密码
 骑士注册

QQ登录

微博登录

搜索
❏ 站外平台:

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

2014-03-13 10:29    评论: 16 收藏: 5    

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

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

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

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

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

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

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

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

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

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

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

输出样例:

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

#10: 等候作业完成

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

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

这是我的一个工作脚本:

#!/bin/bash
# A shell script wrapper to create pdf files for our blog/faq section
########################################################################
# init() - Must be run first 
# Purpose - Create index file in $_tmp for all our wordpress databases 
########################################################################
init(){
 _php="/usr/bin/php"
 _phpargs="-d apc.enabled=0"
 _base="~/scripts"
 _tmp="$_base/tmp"
 _what="$1"
 for i in $_what
 do
        [[ ! -d "$_tmp/$i" ]] && /bin/mkdir "$_tmp/$i"
        $_php $_phpargs -f "$_base/php/rawsqlmaster${i}.php" >  "$_tmp/$i/output.txt"
 done
}

#####################################################
# Without index file, we can out generate pdf files
#####################################################
init blog

###########################################################
# Do not run the rest of the script until init() finished
###########################################################
wait $!

## Alright, create pdf files 
~/scripts/www/pdfwriter.py --profile=blog --type=clean --header=logo\
--footer-left "nixCraft is GIT UL++++ W+++ C++++ M+ e+++ d-" \
--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 命令找出给予命令是否属于内部或外部的。

type -a fg bg jobs disown

输出样式:

fg is a shell builtin
fg is /usr/bin/fg
bg is a shell builtin
bg is /usr/bin/bg
jobs is a shell builtin
jobs is /usr/bin/jobs
disown is a shell builtin

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

总结

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

我会计划在这个系列添加更多深入的教程。若果你需要看到具体的主题,请在下方评论让我知道。


via: http://www.cyberciti.biz/howto/unix-linux-job-control-command-examples-for-bash-ksh-shell/

译者:Luoxcat 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出

123
查看其它分页:

最新评论

我也要发表评论

微博评论 2014-03-14 14:03 回复
@我的印象笔记
—— 2014-3-14 13:40
微博评论 2014-03-14 14:03 回复
转发微博
—— 2014-3-14 13:08
微博评论 2014-03-14 14:03 回复
//@朱海明Ed: //@唐方成:转发微博
—— 2014-3-14 11:31
微博评论 2014-03-13 20:59 回复
转发微博
—— 2014-3-13 18:40
微博评论 2014-03-13 20:59 回复
转发微博
—— 2014-3-13 14:51
微博评论 2014-03-13 13:33 回复
Repost
—— 2014-3-13 13:12
微博评论 2014-03-13 13:33 回复
//@唐方成:转发微博
—— 2014-3-13 13:10
微博评论 2014-03-13 13:33 回复
@有道云笔记收藏
—— 2014-3-13 13:02
微博评论 2014-03-13 12:43 回复
转发微博
—— 2014-3-13 12:42
微博评论 2014-03-13 12:43 回复
转发微博
—— 2014-3-13 12:16
微博评论 2014-03-13 12:43 回复
[疑问]
—— 2014-3-13 12:05
微博评论 2014-03-13 12:43 回复
转发微博
—— 2014-3-13 11:39
微博评论 2014-03-13 12:43 回复
转发微博
—— 2014-3-13 11:14
微博评论 2014-03-13 12:43 回复
转发微博
—— 2014-3-13 11:14
微博评论 2014-03-13 12:43 回复
转发微博
—— 2014-3-13 11:04
微博评论 2014-03-13 12:43 回复
转发微博
—— 2014-3-13 10:59

LCTT 译者

Luoxcat 🌟 🌟 🌟
共计翻译: 39 篇 | 共计贡献: 277
贡献时间:2013-10-10 -> 2014-07-14
访问我的 LCTT 主页 | 在 GitHub 上关注我

收藏

返回顶部

分享到微信

打开微信,点击顶部的“╋”,
使用“扫一扫”将网页分享至微信。