一、问题
使该shell脚本正在运行的进程只有一个,确保部分操作的安全性。特别在系统维护脚本,前一个脚本还没完成,后一个检测时间到了,则同一脚本会执行多次。
二、详解
(1)临时文件
- #!/bin/sh
-
- LOCKFILE="/tmp/autosetup.tmp" #判断临时文件是否存在
-
- trap 'echo "rm lockfile!";rm -f ${LOCKFILE}; exit' 1 2 3 9 15
- #用 trap 命令设置一个对信号的监听器
- #程序运行中当监听到信号 1,2,3,9,15就会删除临时文件,并退出脚本执行
- #比如说,当脚本自行运行结束、被用户 Ctrl+C 掉、被 Kill 掉、终端被关闭
- #系统关机或重启的情况下,都需将临时文件删除,否则脚本以后都没机会执行
- #在 Linux 的 shell 下可以运行 trap -l 查看到所以信号
-
- if [ -f $LOCKFILE ]; then
- echo "Instance is running!" #存在表明有一个实例在运行
- exit 0 #退出本脚本的执行
- else
- touch $LOCKFILE #touch新建一个监时文件
- chmod 600 $LOCKFILE #把临时文件属性改为只建立者可读写
- echo "touch successeed!"
- sleep 10
- echo "finish!"
- fi
-
- rm -f ${LOCKFILE} #正常退出
将sleep换成应该执行的函数或数据操作即可。
上图分别为Ctrl+c中断删除tmp文件、kill中断删除tmp文件、两个进程同时运行只允许一个。
(2)查看进程
- #!/bin/bash
- ScriptName=`basename $0`
- #basename,返回一个字符串参数的基本文件名称
- #pidof -x,找出shell脚本script的进程PID,全部列出进程PID
- if [ `pidof -x $ScriptName | wc -w` -gt 2 ]; then
- echo "Instance is running!"
- exit 0
- else
- sleep 10 #执行程序
- fi
比使用tmp的lock文件简单,但脚本文件名必须是唯一的,否则会错误判断导致无法启动脚本。
注意:以下代码导致脚本始终无法运行,因为启动一个进程后在ps中就有一个,无法检测。
- #!/bin/bash
- ps -ef | grep autosetup.sh | grep -v grep > /dev/null
- if [ $? -eq 0 ];then
- echo "Instance is running!"
- exit 0
- else
- sleep 10
- fi
三、总结
(1)此处只列出单实例运行的两种简单方法,还有其他更好的方法会继续补充。
(2)若有更好的思路也可评论,一起分享。
本文转自:
http://blog.csdn.net/taiyang1987912/article/details/41016987