Как снова установить ловушку 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 doStuff
k
раз я на самом деле называю 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