以顺序方式处理并发作业

时间:2016-10-31 19:00:19

标签: linux bash shell scripting

我正在处理一个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秒开始

1 个答案:

答案 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