如何避免shell脚本被同时运行多次

经验分享  2020-06-03 15:53   6755

代码如下:

#!/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

### 开始正常流程
sleep 10  ### 这里是要执行的内容,此处测试sleep 10秒
### 正常流程结束

### 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 无效


测试:

两个脚本同时执行的话,后执行的脚本会显示以下提示内容。

blob.png

注:转载请注明出处为http://www.sandbean.com/article/127.html。

沙豆网 站长

追求卓越,奋斗不息!

167
文章
8440
点赞

更多文章