shell单例-处理方案

shell单例:当某一个shell脚本需要重复执行时(shell定时任务 etc),为了避免多个相同任务之间交叉,造成数据的混乱或者错误,需要脚本单例执行。

就是前一个进程执行时,后一个进程需要阻塞等待前一个执行完毕。

 

现在有思路如下:

1. 判断上一个进程是否正在运行法。

  该方法首先需要存储前一个执行的进程ID,后面的进程在执行时先判断前一个进程是否正在执行(如果没有,说明执行结束)。如果正在执行,当前线程进入阻塞等待。

  

该方法需要存储上一个线程的pid

每次执行新的线程时,判断上一个线程是否正在执行,如果正在执行,则等待,如果没有,则继续运行。

运行时,先将当前线程的pid写入文件,然后执行。

该方法类似于系统中/var/run/下面的文件的使用。

 http://www.cnblogs.com/husky/p/6422001.html

2. 判断同名线程数量法

  在一个线程启动之前,判断该线程的同名线程的数量,如果达到2个,则表示已有相同线程正在执行,那么新的线程需要进行阻塞。

  如果同名线程数量超过2个,表示有一个正在运行的线程,还有n个阻塞的线程(这边会形成循环阻塞,需要处理)

  流程如下:

  

  缺陷,使用的是进程的名称进行判定(不具备唯一性)特别严谨的情况下不适合使用,但逻辑实现比较简单。

  

#!/bin/bash
flag=`ps -ef | grep $0 | wc -l`
if [[ $flag > 3 ]]; then
        echo "有超过两个以上相同任务的进程在执行,该次任务直接退出!"
        exit
fi

while [[ $flag > 2 ]]
do
        echo `date "+%Y-%m-%d %H:%M:%S"`": sleep 检测到有相同任务的进程在执行,该次任务睡眠等待30分钟!"
        sleep 30m
        flag=`ps -ef | grep $0 | wc -l`
done
echo `date "+%Y-%m-%d %H:%M:%S"`": working 未检测到有相同任务的进程在执行,开启本次任务!"
echo "end"
Code example

 

posted @ 2017-02-27 16:45  时光舟  阅读(445)  评论(0编辑  收藏  举报