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

3 篇文章 0 订阅
3 篇文章 0 订阅

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

 

复制代码 代码如下:


#!/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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以使用循环语句来实现shell脚本重复执行命令,比如使用for循环或while循环。具体实现方式可以根据具体需求和情况来选择,例如可以使用for循环来指定执行次数,或者使用while循环来判断某个条件是否满足。在循环体内部可以编写需要重复执行的命令,以实现自动化操作。同时,还可以使用sleep命令来控制每次执行的时间间隔,以避免过度消耗系统资源。 ### 回答2: Shell脚本是一种自动化执行操作的工具,可以充分利用其编程语言特性实现各种任务。在Shell脚本中,我们可以通过循环、条件语句等结构来实现重复执行命令的功能。 常见的重复执行命令的方式包括循环结构、定时任务等。其中,循环结构最为常见。Shell脚本中,我们可以使用for循环、while循环等方式实现命令的重复执行。例如,我们可以使用for循环执行某个命令10次,如下所示: ``` #!/bin/bash for i in {1..10} do command done ``` 这里,我们利用for循环从1到10遍历,每次执行一次command。通过循环,我们可以轻松实现命令的重复执行。 除了循环结构,还可以使用定时任务的方式实现命令的重复执行。其中,cron是Linux中常用的一种定时任务工具。我们可以通过编辑crontab配置文件来实现定时执行任务。例如,我们可以在每天的特定时间执行某个命令,如下所示: ``` 0 0 * * * command ``` 这里,我们使用cron的格式设定,在每天的0点0分执行一次command。通过定时任务,我们也可以实现命令的重复执行。 总之,Shell脚本提供了各种语法和工具来实现命令的重复执行。通过这些技术,我们可以轻松编写出各种自动化任务,提高效率,减少工作量。 ### 回答3: Shell脚本可以通过循环来实现重复执行某些命令的操作。在Shell脚本中,常用的循环语句包括for循环、while循环和until循环。 1. for循环 for循环一般用于已知循环次数的情况下,语法如下: ``` for 变量名 in 值1 值2... 值n do 循环体 done ``` 例如,要输出数字1到10,可以使用如下代码: ``` for i in {1..10} do echo $i done ``` 2. while循环 while循环一般用于未知循环次数的情况,需要循环条件来判断循环是否继续执行,语法如下: ``` while [ 循环条件 ] do 循环体 done ``` 例如,要实现一个计数器,输出从1开始每5秒加1,直到计数器达到10,可以使用如下代码: ``` i=1 while [ $i -le 10 ] do echo $i sleep 5s i=$((i+1)) done ``` 3. until循环 until循环与while循环类似,只不过是当循环条件不成立时才执行循环体,语法如下: ``` until [ 循环条件 ] do 循环体 done ``` 例如,要实现一个计数器,输出从1开始每5秒加1,直到计数器达到10,可以使用如下代码: ``` i=1 until [ $i -gt 10 ] do echo $i sleep 5s i=$((i+1)) done ``` 以上是几个常用的循环语句,可以根据需要选择适合的循环语句来实现Shell脚本重复执行命令操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值