在做维护的时候,经常要写一些脚本定期检查一些状态信息,而比较糟的时候可能该脚本在执行周期内没完成,接着第二个脚本又开始跑了。如何确保 Shell 脚本只有一个实例运行就成了一个比较有意思的话题。
方法一:使用lockf 命令。
man lockf: lockf -- execute a command while holding a file lock
例:如果要执行 /etc/run.sh ,
/usr/bin/lockf -t 0 /tmp/run.lock /etc/run.sh
例子的含义是:
/usr/bin/lockf -t 0 /tmp/run.lock /etc/run.sh 开始运行时首先检查 /tmp/
下是否有run.lock 文件,是,不执行/etc/run.sh,退出,否,生成/tmp/run.lock 文件,执行/etc/run.sh
当/etc/run.sh 执行完成后,lockf 删除/tmp/run.lock
关于lockf 在非法退出的情况下是否正常删除文件,还不太清楚。
还可以在shell脚本头部创建pid文件,退出时删除pid文件。如果非法退出,则该pid文件不能正常被删除。所以需要在shell中读取该pid,并使用lsof或其他手段检查该锁文件是否正在被该pid进程占有。
方法二:简单一点就是使用ps,但需要保证文件名的唯一(可以使用全路径,运行时也使用全路径),比如脚本/home/han/bin/pwd.sh,可以在该脚本前:
count=`ps ax|grep "/home/han/bin/pwd.s[h]"|wc -l`
[ $count -gt 1 ] && exit 0
阅读(1819) | 评论(1) | 转发(0) |