Как снова установить ловушку bash в коде ловушки?

У меня есть функция 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 doStuffk раз я на самом деле называю launchNextExperiment функционировать один раз для каждого из подмножества моих процессоров, и нужно только один экземпляр doStuff работать на процессоре за раз, так как он очень интенсивно обрабатывает. Вот почему у меня есть блокировка мьютекса. Затем, как только экземпляр doStuff возвращает я хочу, чтобы запустить следующий из k случаи doStuff(на самом деле они все разные симуляции).

Как я могу убедиться, что ловушка установлена ​​для каждой вложенной подоболочки, и, в конце концов, launchNextExperiment выполняется k раз, но только один doStuff на процессор?

1 ответ

Не ответ на ваш вопрос, но то, что вы пытаетесь достичь, может быть сделано без ловушек и недолговечных оболочек:

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
Другие вопросы по тегам