Как получить статус выхода нескольких дочерних процессов, независимо от того, является ли он неудачным или успешным в сценарии оболочки linux
Как можно вернуть или получить статус выхода дочернего процесса индивидуально .
вот вам и дочерний процесс
process()
{
rem=$(( $PID % 2 ))
if [ $rem -eq 0 ]
then
echo "Number is even $PID"
exit 0
else
echo "Number is odd $PID"
exit 1
fi
echo "fred $return"
exit $rem
}
for i in {1..100}; do
process $i &
PID="$!"
echo "$PID:$file"
PID_LIST+="$PID "
done
for process in ${PID_LIST[@]};do
echo "current_PID=$process"
wait $process
exit_status=$?
echo "$process => $exit_status"
done
echo " The END"
я ожидаю, что каждый четный номер статуса выхода должен быть 0, а нечетный номер статуса выхода должен быть 1. но приведенный выше сценарий дает нижеприведенный вывод, где несколько четных чисел имеют статус выхода 1, а несколько нечетных чисел имеют статус выхода 0. может ли кто-нибудь поправить меня?
16687:
16688:
/home/nzv1dtr/sample_file.sh: line 3: % 2 : syntax error: operand expected (error token is "% 2 ")
16689:
Number is odd 16687
16690:
Number is even 16688
16691:
Number is odd 16689
current_PID=16687
16687 => 1
current_PID=16688
16688 => 1
current_PID=16689
Number is even 16690
16689 => 0
current_PID=16690
16690 => 1
current_PID=16691
16691 => 0


Ответы - Как получить статус выхода нескольких дочерних процессов, независимо от того, является ли он неудачным или успешным в сценарии оболочки linux / How to get the multiple child process exit status whether it is failed or success in linux shell scripting

03.02.2020 10:34:23
Здесь происходит еще кое-что. По сути вы на правильном пути, wait
, можете собрать и сообщить о состоянии возврата ребенка, вот так:
for i in {0..20}; do
if [[ $((i % 2)) -eq 1 ]]; then
/bin/true &
else
/bin/false &
fi
a[${i}]=$!
done
for i in ${a[@]}; do
wait ${i}; echo "PID(${i}) returned: $?"
done
Почему вы не видите того же самого?
Ну, для начала, process
- это (на самом деле) не процесс, а функция (следовательно, как упоминалось в комментарии, exit
не является правильным способом его завершения, если он вызывается в скрипте, он завершит весь скрипт, а не только функцию). Это действительно становится процессом, но как его часть. Оболочка породит новую подрешетку и выполнит вашу функцию (следовательно, выход не смертельен для внешнего скрипта). То, в каком состоянии была ваша оболочка в то время, когда она возникла, здесь важно.
Вы также сравниваете с ${PID}
, который на самом деле PID
и для первого вызова дает ошибку. Вы, вероятно, хотели бы искать$$
, за исключением приведенного выше абзаца, означающего, что все функции (вложенные оболочки) будут использовать одно и то же значение (родительского процесса).
Оснащенный этой информацией, минимальным изменением в вашем скрипте будет использование $$
в функции process
, экспорт функции, чтобы мы могли использовать ее в новом экземпляре оболочки, который мы fork
, мы отслеживаем PID
этой новой оболочки:
process()
{
rem=$(( $$ % 2 ))
...
}
export -f process
for i in {1..100}; do
bash -c "process" $i &
...

a[${i}]=$!
я знаю, что это массив, но мне интересно, что "а" не объявлено в скрипте, поэтому, как это работает. Спасибо

