манипулирование кодом возврата в оболочке

Я запускаю оболочки, каскадирующие 3 оболочки. Концептуально так

outside.ksh <parameters>
    middle.ksh <parameter>
     inner1.ksh <para> > Log 2>&1 &
     inner2.ksh <para> > log 2>&1 &
     inner3.ksh <para> > log 2>&1 &
     sleep nnn 
      innern.ksh <para> > log 2>&1 &

Спящие управляющие # потоки запускаются параллельно. Насколько я понимаю, каждая внутренняя оболочка запускается независимо в фоновом режиме - если я использую ожидание вместо сна, ожидание просто ответит на последний блок потока 1 (inner3). Более ранние 2 могут все еще работать, но могут ли они фактически «подождать» завершения всех этих фоновых процессов?

Второй вопрос, который у меня есть, касается кода возврата. Каждая из этих внутренних оболочек будет возвращать свои коды выхода ($?) при запросе, но я бы хотел, чтобы средняя оболочка возвращала 1 окончательный код, если ВСЕ они выполнены успешно, и не ноль, если ЛЮБОЙ из них не удался. Насколько я понимаю, код возврата middle.ksh снова совпадает с последней запущенной внутренней оболочкой. Как мне заставить его учитывать все статусы возврата inner.ksh


person user1874594    schedule 28.01.2014    source источник
comment
Если вы используете wait без аргументов, он ожидает завершения всех фоновых процессов, а не только последнего.   -  person Barmar    schedule 28.01.2014
comment
Здесь нет многопоточности. Когда вы запускаете команду в фоновом режиме, она находится в новом процессе, а не в потоке.   -  person Barmar    schedule 28.01.2014


Ответы (1)


если я использую ожидание вместо сна, ожидание будет просто реагировать на последний блок потока 1 (inner3). Более ранние 2 могут все еще работать, но могут ли они фактически «подождать» завершения всех этих фоновых процессов?

wait без аргументов будет ждать завершения всех дочерних процессов. Его статус возврата будет 0.

Второй вопрос, который у меня есть, касается кода возврата. Каждая из этих внутренних оболочек будет возвращать свои коды выхода ($?) при запросе, но я бы хотел, чтобы средняя оболочка возвращала 1 окончательный код, если ВСЕ они выполнены успешно, и не ноль, если ЛЮБОЙ из них не удался. Насколько я понимаю, код возврата middle.ksh снова совпадает с последней запущенной внутренней оболочкой. Как мне заставить его учитывать все статусы возврата inner.ksh

Вы можете использовать три отдельных wait, а затем объединить их коды возврата в один. Если вы используете идентификаторы заданий, такие как %1, вам также не нужно запоминать отдельные PID.

inner1.ksh <para> > Log 2>&1 &
inner2.ksh <para> > Log 2>&1 &
inner3.ksh <para> > Log 2>&1 &

wait %1; status1=$?
wait %2; status2=$?
wait %3; status3=$?

# Combine the three statuses into one with binary OR. This will only be 0 if
# all three commands returned 0.
exit $((status1 | status2 | status3))

Если вам не нравится сочетать их с |, вы можете использовать это вместо этого:

exit $((status1 == 0 && status2 == 0 && status3 == 0 ? 0 : 1))
person John Kugelman    schedule 28.01.2014