如何在陷阱代码中再次设置bash陷阱?

时间:2010-10-08 12:54:29

标签: bash subshell bash-trap

我有一个调用的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

1 个答案:

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