Как снова установить ловушку bash в коде ловушки? - PullRequest
1 голос
/ 08 октября 2010

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

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

1 Ответ

0 голосов
/ 14 ноября 2010

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

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
...