У меня есть вызываемая функция 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
на процессор?