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
  • 相关阅读:
    git 多人协作
    git 版本管理
    git 安装配置
    git 忽略文件
    git 分支管理
    linux文件管理 文件操作
    linux文件管理 文件搜索
    linux文件管理 文件权限
    linux系统管理 基本指令
    003.html
  • 原文地址:https://www.cnblogs.com/husky/p/6475034.html
Copyright © 2011-2022 走看看