防止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 替换为你要监控的脚本名字
还有一种方法是 死循环 可以根据不同的环境,不同的脚本内容,使用的方法也同步,方法很简单日后在写出来

(0)

相关推荐

  • 防止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## no

  • 如何解决 shell 脚本重复执行的问题

    目录 简介 实例1 实例2 总结 简介 flock 是文件锁命令,它可以保证Linux系统上进程之间安全的访问临界资源,在shell脚本中,可以用来控制逻辑的互斥性 实例1 现有脚本 a.sh, 内容如下 #!/bin/bash echo "[`date +'%Y-%m-%d %H:%M:%S'`] begin pid:$$..." sleep 10 echo "[`date +'%Y-%m-%d %H:%M:%S'`] end pid:$$..." 在终端(记为终

  • shell脚本中执行python脚本并接收其返回值的例子

    1.在shell脚本执行python脚本时,需要通过python脚本的返回值来判断后面程序要执行的命令 例:有两个py程序  hello.py 复制代码 代码如下: def main():     print "Hello" if __name__=='__main__':     main() world.py def main():     print "Hello" if __name__=='__main__':     main() shell 脚本 te

  • Shell脚本中执行sql语句操作mysql的5种方法

    对于自动化运维,诸如备份恢复之类的,DBA经常需要将SQL语句封装到shell脚本.本文描述了在Linux环境下mysql数据库中,shell脚本下调用sql语句的几种方法,供大家参考.对于脚本输出的结果美化,需要进一步完善和调整.以下为具体的示例及其方法. 1.将SQL语句直接嵌入到shell脚本文件中 复制代码 代码如下: --演示环境  [root@SZDB ~]# more /etc/issue  CentOS release 5.9 (Final)  Kernel \r on an \

  • Linux下使用shell脚本自动执行脚本文件

    以下实例本人在Centos6.5 64位操作系统中使用 一.定时复制文件 a.在/usr/local/wfjb_web_back目录下创建 tomcatBack.sh文件 文件内容: #将tomcat中的应用wfjb_web 复制到 /usr/local/wfjb_web_back/tomcat_back/目录下 并按照日期作为文件名称 cp -af /usr/local/apache-tomcat-7.0.73/webapps/wfjb_web /usr/local/wfjb_web_back

  • python scrapy重复执行实现代码详解

    这篇文章主要介绍了python scrapy重复执行实现代码详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架,我们只需要实现少量的代码,就能够快速的抓取 Scrapy模块: 1.scheduler:用来存放url队列 2.downloader:发送请求 3.spiders:提取数据和url 4.itemPipeline:数据保存 from twisted.internet i

  • shell脚本实现监控shell脚本的执行流程及变量的值

    很多时候,我们都会写shell程序来完成一些不用重复造轮子的时刻,但是,又因为shell语句中也会有函数,也会有变量,在运行后到底执行了哪些相关的操作,就需要对具体执行过程中的变量等可变的因素的监控,那么我们下面就写个小小的shell例子,来完成这个对执行过程中条件语句中的变量的变化的监控和整个程序的执行流程的观察. shell程序代码: 复制代码 代码如下: #!/bin/bash function setlogfile {     if ! [ -z "$1" ]; then   

  • shell脚本中执行时提示“没有那个文件或目录”的解决办法

    出现bad interpreter:No such file or directory的原因,是文件格式的问题.这个文件是在Windows下编写的.换行的方式与Unix不一样,但是在vim下面如果不Set一下又完全看不出来. 问题分析:1.将windows 下编写好的SHELL文件,传到linux下执行,提示出错.2.出错信息:bad interpreter: 没有那个文件或目录. 问题原因:因为操作系统是windows,在windows下编辑的脚本,所以有可能有不可见字符.脚本文件是DOS格式

  • Linux crontab定时执行Shell脚本需要执行特定的命令时解决思路

    由于一些不可抗拒的原因,项目部署后需要定时检测项目是否正常运行,否则将执行重启命令. 在具体实施过程中发现,定时器执行无误,但是重启命令无法正常启动.多方查找发现Shell脚本中的Java命令需要引入环境变量方可正常执行.因此做了一下修改,脚本如下(仅供参考): 1.crontab执行配置 * * * * * cd /项目目录 && ./auto_start.sh >> /log/auto.out 2.Shell脚本 #!/bin/bash #导入环境变量 export LAN

  • shell脚本操作postgresql的代码

    PostgreSQL是一种特性非常齐全的自由软件的对象-关系型数据库管理系统(ORDBMS),是以加州大学计算机系开发的POSTGRES,4.2版本为基础的对象关系型数据库管理系统.POSTGRES的许多领先概念只是在比较迟的时候才出现在商业网站数据库中.PostgreSQL支持大部分的SQL标准并且提供了很多其他现代特性,如复杂查询.外键.触发器.视图.事务完整性.多版本并发控制等.同样,PostgreSQL也可以用许多方法扩展,例如通过增加新的数据类型.函数.操作符.聚集函数.索引方法.过程

随机推荐