shell 脚本只执行一次

{
    TMP_LOCK_FILE=/tmp/xxxx.lock.file
    # 检查锁文件是否存在,如果存在表示系统中有其他实例在运行,则直接退出。
    # 需要注意的是,锁文件需要避免重名,可以参照c++ 头文件保护宏的命名方式
    if [ -f $TMP_LOCK_FILE ]; then
        PROC_PID=`cat $TMP_LOCK_FILE`
        if [ `ps aux | grep -v grep | awk -v pid="$PROC_PID" 'BEGIN{res=0}{if($2==pid)res=1}END{printf("%d", res)}' ` -eq 1 ]; then
            echo "the proc is running"
            exit
        else
            echo "the proc was killed when last running"
            rm -rf $TMP_LOCK_FILE
        fi  
    fi  
    sleep 2
    [ -f $TMP_LOCK_FILE ] && exit


    # 开始执行任务前,创建锁文件,并把当前pid 写入锁文件
    echo $$ > $TMP_LOCK_FILE
    sleep 1
    # 判断锁文件中的pid 和当前pid 是否相同 ,如果不同则退出
    [ "x$(cat $TMP_LOCK_FILE)" == "x"$$ ] || exit
    # 执行任务,这里添加你的脚本逻辑
    sleep 60
    # 删除锁文件
    rm -f $TMP_LOCK_FILE
}

你可能感兴趣的:(shell 脚本只执行一次)