NoOps

Ops make no ops | Ops的目标是没有Ops,嗯!

信号在脚本中的应用

作者: |   1,024 浏览  | 

在cloudfoundry /dea中启动一个实例时,会用一个脚本启动多个后台子进程.当发现进程消失时,会在清理该实例后,重新启动一个实例.

启动脚本一般是这个样子

这没有什么问题,当需要多个子进程,那么看上去应该是这个样子

问题出现了

1 我们可能希望的效果是当任意子进程结束,结束所有子进程后,脚本退出
2 wait 会等待a.sh和b.sh都退出后,才释放,这不是我们希望的

能监听单个子进程的waitpid在shell脚本里不提供,这里可以用信号来处理

子进程退出时,会给父进程发送一个CHLD信号
但在dash环境中,只有后台子进程退出时,才会给父进程发送CHLD信号,所以选择dash执行脚本

那么脚本看上去就是这样的:

这样,当a.sh或者b.sh任何一个退出了,就会执行clean_jobs函数,然后调用kill_tree杀掉当前进程的所有子进程后退出,说明如下:

*以上脚本在centos6.3,ubuntu12.04上工作正常

3 Comments

  1. wilbur
    2013/03/06 at 7:27 下午

    波哥,是bash吧。擦,居然没表情插件……

    • 2013/03/06 at 8:27 下午

      bash和dash对chld信号的处理方式不一样,我这里用的是dash

    • 2013/08/15 at 8:14 上午

      dash是FreeBSD上的ash,移植到debian上的版本

wilbur 进行回复 取消回复