我正在处理一个bash脚本,其中多个实例可能同时运行。我试图阻止这种情况发生。所以我使用flock机制来确保只有一个脚本实例正在运行。其他情况等待轮到他们。
exec 200<$LOCK
flock -x 200
echo "secured flock $1"
sleep 10
echo "exit $1"
然而,采用这种方法并不能保证执行顺序。 例如:
# ~/proj/scripts $ sudo ./parallel.sh 2 &
[2] 10668
# ~/proj/scripts $ sudo ./parallel.sh 3 &
[3] 10674
# ~/proj/scripts $ sudo ./parallel.sh 4 &
[4] 10681
# ~/proj/scripts $ sudo ./parallel.sh 5 &
[5] 10687
# ~/proj/scripts $ sudo ./parallel.sh 6 &
[6] 10696
secured flock 3 exit 3
secured flock 6 exit 6
secured flock 4 exit 4
secured flock 2 exit 2
secured flock 5 exit 5
我试图看看是否可以通过保证调用顺序来实现相同的可靠性保护
上面的例子只是过于简单化了。
这些过程通常会每隔5秒钟定期开始。但有时可能需要超过5秒(比如10秒)才能完成执行。所以我可以肯定地说,过程2将在过程3之前开始。但是如果过程2需要很长时间才能完成,那么无法保证过程4-6将以相同的顺序启动,即使它们相隔约5秒开始
答案 0 :(得分:0)
如何拥有一个可以并行提交的队列守护进程,然后以串行方式执行这些作业?
来自https://www.gnu.org/software/parallel/man.html#EXAMPLE:-GNU-Parallel-as-queue-system-batch-manager
true >jobqueue; tail -n+0 -f jobqueue | parallel -j1
然后你可以每5秒提交一份工作,如:
echo my_command my_arg >> jobqueue