|
|
51CTO旗下网站
|
|
挪动端

“Exit Trap” 让你的Bash剧本更稳定牢靠

有个复杂适用的本领可以让你的 bash 剧本更妥当 -- 确保总是实行须要的扫尾任务,哪怕是在发作非常的时分。要做到这一点,法门便是 bash 提供的一个叫做 EXIT 的伪信号,你可以 trap 它,当剧本由于任何缘由加入时,相应的下令或函数就会实行。我们来看看它是怎样任务的。

作者:Aaron Maxwell泉源:通博8888官网中国|2018-05-14 15:55

http://s1.51cto.com/oss/201805/14/5d02c55b92d4af8535409997c774c222.jpeg-wh_651x-s_3945587282.jpeg

有个复杂适用的本领可以让你的 bash 剧本更妥当 -- 确保总是实行须要的扫尾任务,哪怕是在发作非常的时分。要做到这一点,法门便是 bash 提供的一个叫做 EXIT 的伪信号,你可以 trap 它,当剧本由于任何缘由加入时,相应的下令或函数就会实行。我们来看看它是怎样任务的。

根本的代码构造看起来像如许:

  1. #!/bin/bash
  2. function finish {
  3. # 你的扫尾代码
  4. }
  5. trap finish EXIT

你可以把任何你以为务须要运转的代码放在这个 finish 函数里。一个很好的例子是:创立一个暂时目次,预先再删除它。

  1. #!/bin/bash
  2. scratch=$(mktemp -d -t tmp.XXXXXXXXXX)
  3. function finish {
  4. rm -rf "$scratch"
  5. }
  6. trap finish EXIT

如许,在你的中心代码中,你就可以在这个 $scratch 目次里下载、天生、操纵两头或暂时数据了。注1

  1. # 下载一切版本的 linux 内核…… 为了迷信研讨!
  2. for major in {1..4}; do
  3. for minor in {0..99}; do
  4. for patchlevel in {0..99}; do
  5. tarball="linux-${major}-${minor}-${patchlevel}.tar.bz2"
  6. curl -q "http://kernel.org/path/to/$tarball" -o "$scratch/$tarball" || true
  7. if [ -f "$scratch/$tarball" ]; then
  8. tar jxf "$scratch/$tarball"
  9. fi
  10. done
  11. done
  12. done
  13. # 整分解单个文件
  14. # 复制到目的地位
  15. cp "$scratch/frankenstein-linux.tar.bz2" "$1"
  16. # 剧本完毕, scratch 目次主动被删除

比拟一下假如不必 trap ,你是怎样删除 scratch 目次的:

  1. #!/bin/bash
  2. # 别如许做!
  3.  
  4. scratch=$(mktemp -d -t tmp.XXXXXXXXXX)
  5.  
  6. # 在这里拔出你的几十上百行代码
  7.  
  8. # 都搞定了,加入之前把目次删除
  9. rm -rf "$scratch"

这有什么题目么?许多:

  • 假如运转堕落招致剧本提早加入, scratch 目次及外面的内容不会被删除。这会招致材料走漏,能够引发平安题目。
  • 假如这个剧本的设计初志便是在剧本末端曩昔加入,那么你必需手动复制粘贴 rm 下令到每一个出口。

  • 这也给维护带来了费事。假如以后在剧本某处添加了一个 exit ,你很能够就忘了加上删除操纵 -- 从而制造潜伏的平安破绽。

无论怎样,效劳要在线

别的一个场景: 想象一下你正在运转一些主动化零碎运维义务,要暂时封闭一项效劳,最初这项效劳需求重启,并且要十拿九稳,即便剧本运转堕落。那么你可以如许做:

  1. function finish {
  2. # 重启效劳
  3. sudo /etc/init.d/something start
  4. }
  5. trap finish EXIT
  6. sudo /etc/init.d/something stop
  7. # 次要义务代码
  8.  
  9. # 剧本完毕,实行 finish 函数重启效劳

一个详细的实例:比方 Ubuntu 效劳器上运转着 MongoDB ,你要为 crond 写一个剧本降临时封闭效劳并做一些一样平常维护任务。你应该如许写:

  1. function finish {
  2. # 重启效劳
  3. sudo service mongdb start
  4. }
  5. trap finish EXIT
  6. # 封闭 mongod 效劳
  7. sudo service mongdb stop
  8. # (假如 mongod 设置装备摆设了 fork ,比方 replica set ,你能够需求实行 sudo killall --wait /usr/bin/mongod”) 

控制开支

有一种状况特殊能表现 EXIT trap 的代价:假如你的剧本运转进程中需求初始化一下本钱昂扬的资源,完毕时要确保把它们开释失。比方你在 AWS (Amazon Web Services) 上任务,要在剧本中创立一个镜像。

(名词表明: 在亚马逊云上的运转的效劳器叫“实例”。实例从亚马逊呆板镜像Amazon Machine Image创立而来,通常被称为 “AMI” 或 “镜像” 。AMI 相称于某个特别工夫点的效劳器快照。)

我们可以如许创立一个自界说的 AMI :

  1. 基于一个基准 AMI 运转一个实例(比方,启动一个效劳器)。
  2. 在实例中手动或运转剧本来做一些修正。
  3. 用修正后的实例创立一个镜像。
  4. 假如不再需求这个实例,可以将其删除。

最初一步相称紧张。假如你的剧本没有把实例删撤除,它会不断运转并计费。(到月尾你的账单让你大跌眼镜时,恐怕哭都来不及了!)

假如把 AMI 的创立封装在剧本里,我们就可以应用 trap EXIT 来删除实例了。我们还可以用上 EC2 的下令行东西:

  1. #!/bin/bash
  2. # 界说基准 AMI ID
  3. ami=$1
  4. # 保管暂时实例的 ID
  5. instance=''
  6. # 作为 IT 人,让我们看看 scratch 目次的另类用法
  7. scratch=$(mktemp -d -t tmp.XXXXXXXXXX)
  8. function finish {
  9. if [ -n "$instance" ]; then
  10. ec2-terminate-instances "$instance"
  11. fi
  12. rm -rf "$scratch"
  13. }
  14. trap finish EXIT
  15. # 创立实例,将输入(包括实例 ID )保管到 scratch 目次下的文件里
  16. ec2-run-instances "$ami" > "$scratch/run-instance"
  17. # 提取实例 ID
  18. instance=$(grep '^INSTANCE' "$scratch/run-instance" | cut -f 2)

剧本实行到这里,实例(EC2 效劳器)曾经开端运转 注2。接上去你可以做任何事变:在实例中装置软件,修正设置装备摆设文件等,然后为终极版本创立一个镜像。实例会在剧本完毕时被删除 -- 即便剧本因错误而提早加入。(请确保实例创立乐成后再运转业务代码。)

更多使用

这篇文章只讲了些皮毛。我曾经运用这个 bash 本领许多年了,如今还能时时发明一些风趣的用法。你也可以把这个办法使用到你本人的场景中,从而提拔你的 bash 剧本的牢靠性。

尾注

  • 注1. mktemp 的选项 -t 在 通博8888官网 上是可选的,在 OS X 上是必须的。带上此选项可以让你的剧本有更好的可移植性。
  • 注2. 假如只是为了获取实例 ID ,我们不必创立文件,间接写成 instance=$(ec2-run-instances "$ami" | grep '^INSTANCE' | cut -f 2) 就可以。但把输入写入文件可以记载更多有效信息,便于调试 ,代码可读性也更强。 

【编辑引荐】

  1. 怎样在通博8888官网上检查用户的创立日期
  2. 万万万万不行运转的通博8888官网下令
  3. 在Ubuntu和通博8888官网 Mint中轻松装置Android Studio
  4. 女生适不合适进入IT行业做通博8888官网运维工程师?
  5. 逼格高又适用的通博8888官网初级下令,开辟运维都要懂
【责任编辑:庞桂玉 TEL:(010)68476606】

点赞 0
各人都在看
猜你喜好

读 书 +更多

《ASP.NET AJAX Web 使用开辟法门(VB版)》

本书细致引见了AJAX在Web开辟上的使用。次要内容包罗:ASP.NET AJAX技能概述、完成异步部分更新页面、UpdatePanel编程功用、PageRequestMan...

订阅51CTO邮刊

点击这里检查样刊

订阅51CTO邮刊