首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >检查脚本重复执行

检查脚本重复执行
EN

Stack Overflow用户
提问于 2019-02-14 22:45:07
回答 2查看 70关注 0票数 0

我有一个bash脚本,有时,即使我的脚本被安排好了,它也会被执行两次。因此,我添加了几行代码来检查脚本是否已经在执行。起初我没有问题,但在过去的三天里,我又有了问题

代码语言:javascript
复制
PID=`echo $$`
PROCESS=${SL_ROOT_FOLDER}/xxx/xxx/xxx_xxx_$PID.txt     
ps auxww | grep $scriptToVerify | grep -v $$ | grep -v grep > $PROCESS
num_proc=`awk -v RS='\n' 'END{print NR}' $PROCESS`
if [ $num_proc -gt 1 ];
then
  sl_log "---------------------------Warning---------------------------"
  sl_log "$scriptToVerify already executed"
  sl_log "num proc $num_proc"
  sl_log "--------"
  sl_log $PROCESS
  sl_log "--------"
  exit 0;
fi

通过这种方式,我检查我的日志中有多少行,如果结果不止一个,那么我有两个正在执行的进程,其中一个进程将被停止。但是,这种方法不能正常工作。我如何修复我的代码,以检查我有多少脚本在执行?

EN

回答 2

Stack Overflow用户

发布于 2019-02-14 23:15:41

任何涉及以下内容的内容:

基于results

  • finish

  1. read some state results
  2. finish

results

  • do action

必须同时完成这三个步骤,否则就会出现“竞速”的情况。例如:

  • (A)读取状态
  • (A)检查结果(ok)
  • (A)执行操作(ok)
  • (A)完成

<代码>H119(B)读取状态<代码>H220<代码>H121(B)检查结果(错误)<代码>H222<代码>H123(B)执行操作(错误)<代码>H224<代码>H125(B)完成H226<代码>F227

但如果时间稍有不同:

  • (A)读取状态
  • (A)检查结果(ok)
    • (B)读取状态
    • (B)检查结果

  • (A)执行操作(ok)
    • (B)执行操作ok

  • (A)完成
    • (B) finishes

人们通常给出的例子是更新银行余额。

使用您的方法,您可能能够降低代码运行的频率,但您永远无法完全避免它。

更好的解决方案是使用锁定。这保证了一次只能运行一个进程。例如,使用flock,您可以包装对脚本的所有调用:

代码语言:javascript
复制
flock -x /var/lock/myscript-lockfile myscript

或者,在您的脚本中,您可以执行以下操作:

代码语言:javascript
复制
exec 300>/var/lock/myscript-lockfile
flock -x 300

# rest of script

flock -u 300

或者:

代码语言:javascript
复制
exec 300>/var/logk/myscript-lockfile
if ! flock -nx 300; then
    # another process is running
    exit 1
fi

# rest of script

flock -u 300
票数 1
EN

Stack Overflow用户

发布于 2019-02-14 23:24:49

flock(1)

代码语言:javascript
复制
#!/bin/bash

# Makes sure we exit if flock fails.
set -e

(
  # Wait for lock on /var/lock/.myscript.exclusivelock (fd 200) for 10 seconds
  flock -x -w 10 200

  # Do stuff

) 200>/var/lock/.myscript.exclusivelock

这确保了"(“和")”之间的代码一次只由一个进程运行,并且该进程等待锁的时间过长。

Credit goes to Alex B

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54693054

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档