我有一个调用的bash函数必须在第一次调用它后由EXIT陷阱调用。该函数一旦退出就会再次设置陷阱。
echo 0 > .i
function launchNextExperiment
{
( # Run in nested subshell
# Implement a mutex lock, not shown
j=`cat .i`
if [ $j -lt $k ]
then
trap launchNextExperiment EXIT # set trap for this nested subshell
./doStuff &
let j=j+1
echo $j > .i # variables are not known in outer shell, therefore use
# the file .i as a counter
fi
wait # wait for doStuff to return from background before exiting
# from this nested shell and causing an EXIT signal
)
}
launchNextExperiment &
我遇到的问题是陷阱只被触发一次,换句话说doStuff
只被执行两次。
我没有使用简单的for循环执行doStuff
k
次的原因是我实际上为每个CPU子集调用launchNextExperiment
函数一次,并且只需要一个doStuff
的实例一次在CPU上运行,因为它处理非常密集。这也是我有一个互斥锁的原因。然后,只要doStuff
的实例返回,我就想启动k
的{{1}}实例的下一个(实际上它们都是不同的模拟)。
如何确保为每个嵌套的子shell设置陷阱,最后doStuff
执行launchNextExperiment
次,但每个CPU只有一个k
?
答案 0 :(得分:0)
不是你问题的答案,但是你想要完成的事情可以在没有陷阱和子弹的情况下完成:
echo 0>i
k=10
dispatch_work()
{
mutex_lock
i=$(<i)
let i++
echo $i>i
mutex_unlock
if [ $i < $k ]; do
do_work $i
dispatch_work
fi
}
for c in $(seq 1 $cpus); do
dispatch_work &
done