【shell】防止脚本重复运行

有些业务脚本需要防止重复,以便造成业务数据不一致。

所以,一般在脚本运行开始,就首先要检查当前系统是否有该脚本的运行进程。

一般人多半是这样写的(比如我们系统里的那帮人):

processName="OMIGet_HOUR.sh"
processNum=`ps -aef |grep "${processName}" | wc -l`

if [ "${processNum}" -gt "3" ]; then
  echo "已经有脚本在运行,本脚本不支持多实例运行${processNum}"
  exit 1
fi

这样写有个问题,是什么呢?

ps -ef  | grep 的返回结果在是否包含grep时具有不确定性(可以加上-v参数避免,但很麻烦)。所以稍不注意,判断就会失败。

其实我们可以使用更安全的一种方式来判断,如:

#!/bin/ksh

RUNDIR=`dirname $0`
PIDFILE="${RUNDIR}/$0.pid"

if [ -s ${PIDFILE} ]; then
  echo "脚本已经在运行,不重复运行,退出."
  exit 1
fi
echo $$ > ${PIDFILE}

<各种业务处理逻辑>

cat /dev/null > ${PIDFILE}
借助pidfile来判断,脚本在运行之初判断是否有进程号即可。

当然,如果脚本在运行之中被强制kill掉,那么下次怎么也运行不起来了。

不过这个问题,我们可以这样来解决:在脚本“假退出”之前,通过各种告警来提示维护人员(以手工介入处理)。


网上有很多关于在shell执行文件本身通过flock的命令加锁来实现互斥的方式,个人觉得,该方法不具有自助可控性,风险较大,最重要的是不具有平台通用性。

所以更加推荐如下方式:

#!/bin/ksh

RUNDIR=`dirname $0`
PIDFILE="${RUNDIR}/$0.pid"

if [ -s ${PIDFILE} ]; then
   SPID=`cat ${PIDFILE}`
   if [ -e /proc/${SPID}/status ]; then
      echo "脚本已经在运行,不重复运行,退出."
      exit 1
  fi
  cat /dev/null > ${PIDFILE}
fi
echo $$ > ${PIDFILE}

#各种业务逻辑

cat /dev/null > ${PIDFILE}

经过测试,该方法能够表现良好。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Shell脚本运行另一个Shell脚本可以通过两种方式实现。第一种方式是在当前进程中运行另一个Shell脚本,可以使用source命令或点号(.)来执行。这样做会将另一个Shell脚本的内容直接插入到当前Shell脚本的执行环境中,不会创建新的进程。例如,可以使用以下命令来运行另一个Shell脚本: ``` source 另一个脚本.sh . 另一个脚本.sh ``` 第二种方式是在新的进程中运行另一个Shell脚本,可以使用以下命令来执行: ``` ./另一个脚本.sh ``` 在这种情况下,需要为另一个Shell脚本添加可执行权限,并指定正确的路径。注意,这种方式会创建一个新的Shell进程来执行另一个脚本。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [Shell脚本【2】写和运行Shell脚本](https://blog.csdn.net/qq_43624033/article/details/106455124)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [shell----shell脚本运行](https://blog.csdn.net/weixin_45606836/article/details/104377197)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值