防止shell脚本重复执行的代码

 更新时间:2013年01月23日 17:35:56   作者:  
利用锁机制,让一个特定的shell脚本,每次只能运行一个实例。具体来说,获得锁的脚本实例,能够继续往下执行临界区代码;没有获得锁的实例,则只能等待

例如,要求脚本只能顺序访问某个资源,例如磁盘文件等,就可以参考下面的实现。

复制代码 代码如下:

#!/bin/bash
#
# file locking using bash.
# ver 0.1.6
#
# author : malundao ( malundao@sina.com )
# date   : 2011-08-31  
# ref    : http://unix.derkeiler.com/Newsgroups/comp.unix.shell/2005-09/0472.html
#
# note:
#   shflock_cleanhook() is a user defined function to clean up user-specific sth.
#
# /path/to/lock/. note; directory, not a file.
# should be modified
LOCKPATH="/tmp"
cleanup() {
        shflock_cleanhook
        cd $LOCKPATH
        [ -e lock.pid ] || exit
        read pid >/dev/null 2>&1 <lock.pid
        if [ -n "$pid" ]; then
            if [ "$pid" == "$$" ]; then
                rm -f lock.$pid
                rm -f lock.pid
                exit
            fi 
        fi 
        exit
}
#  trap EXIT ?
trap 'cleanup' HUP INT TERM
getlock() {
        oldpath=`pwd`
        cd $LOCKPATH
        while
                echo $$ > lock.$$
                [ -e lock.pid ]
        do
                rm lock.$$
                read pid >/dev/null 2>&1 <lock.pid
                if [ -n "$pid" ]; then
                        if [ -e /proc/$pid ]; then
                                cd $oldpath
                                return 1 # Lock is taken by others
                        else
                                #unsafe: rm -f lock.$pid
                                echo WARN: please delete stale lock.pid by HAND.
                                return 2
                        fi
                else
                        # sleep some seconds,then back to 'while' loop
                        # 11 is a prime number, $$ as a random. 
                        echo sleep $(( $$ % 11 ))
                        sleep $(( $$ % 11 ))
                fi
        done
        # 'ln -s' is an atom op.
        ln -s lock.$$ lock.pid >/dev/null 2>&1
        if [ $? -eq 0 ]; then
                cd $oldpath
                return 0 # We got the lock
        else
                [ -e lock.pid ] || echo WARN: please delete hanging lock.pid by HAND.
                cd $oldpath
                return 3 # Lock is probably taken by others.
        fi
}
putlock () {
    oldpath=`pwd`
    cd $LOCKPATH && rm -f lock.$$ lock.pid
    cd $oldpath
}
## test
shflock_cleanhook() {
    echo i\'m a hook.
}
while true; do
    while ! getlock; do
        #echo wait a second...
        sleep 1
    done
    echo \[$$\] `date` ,now hold lock for 3 seconds...
    sleep 3
    #echo putlock
    putlock
    sleep 1 # yield
done

防止脚本多次执行(一)
复制代码 代码如下:

while [ `ps x |grep -v grep|grep filename.sh|wc -l` -gt 0 ];
do
        exit
done

把内容放在脚本最上面

filename.sh 替换为你要监控的脚本名字
还有一种方法是 死循环 可以根据不同的环境,不同的脚本内容,使用的方法也同步,方法很简单日后在写出来

相关文章

  • Shell脚本运行中的停止方法实现

    Shell脚本运行中的停止方法实现

    Linux系统Shell中提交了一个脚本,但是需要停止这个进程,如何处理?本文就来详细的介绍一下,感兴趣的可以了解一下
    2021-11-11
  • Linux禁止普通用户su至root的解决方法

    Linux禁止普通用户su至root的解决方法

    很多朋友不清楚linux如何禁止普通用户su到root,这里需要修改两个配置文件,具体详细配置大家通过本文了解下吧
    2017-08-08
  • shell 通过makefile传参给c语言的实现示例

    shell 通过makefile传参给c语言的实现示例

    本文主要介绍了shell 通过makefile传参给c语言的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • Linux中popen函数的作用小结

    Linux中popen函数的作用小结

    popen()函数通过创建一个管道,调用fork()产生一个子进程,执行一个shell以运行命令来开启一个进程。这篇文章重点给大家介绍Linux中popen函数的作用,感兴趣的朋友一起看看吧
    2018-05-05
  • shell脚本编程之数组

    shell脚本编程之数组

    数组就是相同数据类型的元素按一定顺序排列的集合,就是把有限个类型相同的变量用一个名字命名,然后用编号区分他们的变量的集合,这个名字称为数组名,编号称为下标
    2016-01-01
  • 如何短时间内学好一门语言 shell脚本语言为例

    如何短时间内学好一门语言 shell脚本语言为例

    这篇文章主要以shell脚本语言为例,为大家介绍了如何短时间内学好一门语言,感兴趣的小伙伴们可以参考一下
    2016-09-09
  • Ubuntu服务器配置apache2.4的限速功能shell脚本分享

    Ubuntu服务器配置apache2.4的限速功能shell脚本分享

    这篇文章主要介绍了Ubuntu服务器配置apache2.4的限速功能shell脚本分享,本文直接给出脚本实现代码,代码相关原理都写在了注释里,需要的朋友可以参考下
    2015-03-03
  • ubuntu与centos中更换ip的shell代码

    ubuntu与centos中更换ip的shell代码

    ubuntu与centos中更换ip的shell代码,需要的朋友可以参考下
    2013-02-02
  • shift妙用之解决shell编程中的入参问题

    shift妙用之解决shell编程中的入参问题

    shell编程经常会遇到参数个数不定的这种情况,这种情况怎么处理呢?shift就要闪亮登场了
    2013-08-08
  • linux shell 中双引号和单引号的区别解析

    linux shell 中双引号和单引号的区别解析

    最近在编写shell脚本时,发现引号使用的比较频繁,也出现过小问题,现根据我的使用情况做一下总结,也加深一下自己的印象,这篇文章主要介绍了linux shell 中双引号和单引号的区别解析,需要的朋友可以参考下
    2024-02-02

最新评论