防止shell脚本重复执行
今天在jenkins里部署的时候,由于开发们多次频繁的提交的代码,造成jenkins里的shell脚本在那频繁的部署,为了阻止这样的问题,专门找了个防止重复执行的代码.下面来看代码:
cat /root/soft_shell/check.sh
#!/bin/bash LOCK_NAME="/tmp/my.lock" if ( set -o noclobber; echo "$$" > "$LOCK_NAME") 2> /dev/null; then trap 'rm -f "$LOCK_NAME"; exit $?' INT TERM EXIT ### 开始正常流程 ### 正常流程结束 ### Removing lock rm -f $LOCK_NAME trap - INT TERM EXIT else echo "Failed to acquire lockfile: $LOCK_NAME." echo "Held by $(cat $LOCK_NAME)" exit 1 fi echo "Done."
set -o noclobber 的意思:
If set,bash does not overwrite an existing file with the >, >&, and <> redirection operators.
这样就能保证my.lock只能被一个进程创建出来。比touch靠谱多了。
trap 可以捕获各种信号,然后做出处理:
INT 用来处理 ctrl+c取消脚本执行的情况。
TERM 用来处理 kill -TERM pid 的情况。
EXIT 不清楚
另外,对于 kill -9 无效.
ps:http://blog.liudongkai.com/2012/11/08/prevent-shell-running-at-the-same-time/
评论: