shell实例浅谈之十一单实例运行(shell运行一次)

一、问题

      使该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换成应该执行的函数或数据操作即可。

shell实例浅谈之十一单实例运行(shell运行一次)_第1张图片

上图分别为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)若有更好的思路也可评论,一起分享。

你可能感兴趣的:(Shell编程实例)