我有一个被调用的 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
时间的原因是,我实际上launchNextExperiment
为我的 CPU 子集的每个调用该函数一次,并且一次只希望一个实例doStuff
在 CPU 上运行,因为它非常处理密集的。这也是我有互斥锁的原因。然后,一旦一个实例doStuff
返回,我就想启动下一个k
实例doStuff
(实际上它们都是不同的模拟)。
如何确保为每个嵌套的子 shell 设置了陷阱,最后launchNextExperiment
是执行时间,但每个 CPUk
只有一个?doStuff