shell实例浅谈之十一单实例运行(shell运行一次)

一、问题

      使该shell脚本正在运行的进程只有一个,确保部分操作的安全性。特别在系统维护脚本,前一个脚本还没完成,后一个检测时间到了,则同一脚本会执行多次。

二、详解

(1)临时文件

#!/bin/sh

LOCKFILE="/tmp/autosetup.tmp"   #判断临时文件是否存在

trap 'echo "rm lockfile!";rm -f ${LOCKFILE}; exit' 1 2 3 9 15
#用 trap 命令设置一个对信号的监听器
#程序运行中当监听到信号 1,2,3,9,15就会删除临时文件,并退出脚本执行
#比如说,当脚本自行运行结束、被用户 Ctrl+C 掉、被 Kill 掉、终端被关闭
#系统关机或重启的情况下,都需将临时文件删除,否则脚本以后都没机会执行
#在 Linux 的 shell 下可以运行 trap -l 查看到所以信号

if [ -f $LOCKFILE ]; then
    echo "Instance is running!" #存在表明有一个实例在运行
    exit 0                      #退出本脚本的执行
else
    touch $LOCKFILE             #touch新建一个监时文件
    chmod 600 $LOCKFILE         #把临时文件属性改为只建立者可读写
    echo "touch successeed!"
    sleep 10
    echo "finish!"
fi

rm -f ${LOCKFILE}               #正常退出
将sleep换成应该执行的函数或数据操作即可。

上图分别为Ctrl+c中断删除tmp文件、kill中断删除tmp文件、两个进程同时运行只允许一个

(2)查看进程

#!/bin/bash
ScriptName=`basename $0`
#basename,返回一个字符串参数的基本文件名称
#pidof -x,找出shell脚本script的进程PID,全部列出进程PID
if [ `pidof -x $ScriptName | wc -w` -gt 2 ]; then
  echo "Instance is running!"
  exit 0
else
  sleep 10      #执行程序 
fi
比使用tmp的lock文件简单,但脚本文件名必须是唯一的,否则会错误判断导致无法启动脚本。

注意:以下代码导致脚本始终无法运行,因为启动一个进程后在ps中就有一个,无法检测。

#!/bin/bash
ps -ef | grep autosetup.sh | grep -v grep > /dev/null
if [ $? -eq 0 ];then
    echo "Instance is running!"
    exit 0
else
    sleep 10
fi

三、总结

(1)此处只列出单实例运行的两种简单方法,还有其他更好的方法会继续补充。

(2)若有更好的思路也可评论,一起分享。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

乌托邦2号

博文不易,支持的请给予小小打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值