我有一个bash脚本,有时,即使我的脚本被安排好了,它也会被执行两次。因此,我添加了几行代码来检查脚本是否已经在执行。起初我没有问题,但在过去的三天里,我又有了问题
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通过这种方式,我检查我的日志中有多少行,如果结果不止一个,那么我有两个正在执行的进程,其中一个进程将被停止。但是,这种方法不能正常工作。我如何修复我的代码,以检查我有多少脚本在执行?
发布于 2019-02-14 23:15:41
任何涉及以下内容的内容:
基于results
的
results
必须同时完成这三个步骤,否则就会出现“竞速”的情况。例如:
<代码>H119(B)读取状态<代码>H220<代码>H121(B)检查结果(错误)<代码>H222<代码>H123(B)执行操作(错误)<代码>H224<代码>H125(B)完成H226<代码>F227
但如果时间稍有不同:
人们通常给出的例子是更新银行余额。
使用您的方法,您可能能够降低代码运行的频率,但您永远无法完全避免它。
更好的解决方案是使用锁定。这保证了一次只能运行一个进程。例如,使用flock,您可以包装对脚本的所有调用:
flock -x /var/lock/myscript-lockfile myscript或者,在您的脚本中,您可以执行以下操作:
exec 300>/var/lock/myscript-lockfile
flock -x 300
# rest of script
flock -u 300或者:
exec 300>/var/logk/myscript-lockfile
if ! flock -nx 300; then
# another process is running
exit 1
fi
# rest of script
flock -u 300发布于 2019-02-14 23:24:49
flock(1)
#!/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这确保了"(“和")”之间的代码一次只由一个进程运行,并且该进程等待锁的时间过长。
https://stackoverflow.com/questions/54693054
复制相似问题