启动bash

时间:2017-04-22 09:46:30

标签: multithreading bash synchronization

我只想做一个等待释放锁定。

我有例如4(因为我有4个核心)相同的脚本,每个脚本在每个脚本的一部分上工作:

#!/bin/bash
./prerenderscript $1
scriptsync step1 4
./renderscript $1
scriptsync step2 4
./postprod $1

当我运行调用四个脚本的主脚本时,我希望每个脚本单独工作,但在某些时候,我希望每个脚本都相互等待,因为下一部分需要第一部分的所有数据。 / p>

现在我使用了一些逻辑,比如为每个进程创建的文件或文件的数量,以及它们的存在与其他进程的测试。

我也有想法使用makefile并拥有

prerender%: source
  ./prerender $@
renderscript%: prerender1 prerender2 prerender3 prerender4
  ./renderscript $@
postprod: renderscript1 renderscript2 renderscript3 renderscript4
  ./postprod $@

但实际上这个过程在这里被简化了,脚本更复杂,并且每个步骤线程都需要保留他的变量。

无论如何都要使脚本同步而不是占位符命令scriptsync。

1 个答案:

答案 0 :(得分:0)

要在Bash中实现这一点,一种方法是使用进程间通信使任务等待前一个完成。这是一个例子。

#!/bin/bash

# $1 is received to allow for an example command, not required for the mechanism suggested
task_a()
{
# Do some work
sleep $1 # This is just a dummy command as an example
echo "Task A/$1 completed" >&2
# Send status to stdin, telling next task to proceed
echo "OK"
}

task_b()
{
IFS= read status ; [[ $status = OK ]] || return 1
# Do some work
sleep $1 # This is just a dummy command as an example
echo "Task B/$1 completed" >&2
}

task_a 2 | task_b 2 &
task_a 1 | task_b 1 &
wait

您会注意到read可能位于任务B的任何位置,因此您可以执行某些工作,然后等待(read)执行其他任务,然后继续。您可以将任务A发送给任务B的许多信号和几个相应的read语句。

如示例所示,您可以并行启动多个管道。

这种方法的一个限制是管道在一个写入器和一个读取器之间建立通信通道。如果任务需要等待来自多个任务的信号,则需要FIFO来允许具有依赖关系的任务从多个源读取。