zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    切片 Slice
    表单与v-model
    vue-内置指令
    go单元测试
    go异常处理
    设计模式
    django数据库事务
    go interface衍生的插件化处理
    goroutine
    drf之序列化
  • 原文地址:https://www.cnblogs.com/husky/p/6475034.html
Copyright © 2011-2022 走看看