Как получить статус выхода нескольких дочерних процессов, независимо от того, является ли он неудачным или успешным в сценарии оболочки linux

Как получить статус выхода нескольких дочерних процессов, независимо от того, является ли он неудачным или успешным в сценарии оболочки linux

03.02.2020 07:18:40 Просмотров 2 Источник

Как можно вернуть или получить статус выхода дочернего процесса индивидуально .

вот вам и дочерний процесс

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

Ondrej K.

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 &
...
https://stackoverflow.com/questions/60043157/how-to-get-the-multiple-child-process-exit-status-whether-it-is-failed-or-succes/60045999#comment106208814_60045999
Привет, Ондрей твой ответ мне помог, но не мог бы ты объяснить a[${i}]=$!я знаю, что это массив, но мне интересно, что "а" не объявлено в скрипте, поэтому, как это работает. Спасибо
https://stackoverflow.com/questions/60043157/how-to-get-the-multiple-child-process-exit-status-whether-it-is-failed-or-succes/60045999#comment106210546_60045999
@ongrej, я попробовал ту же логику с моим сценарием, не могли бы вы объяснить, что такое worng с моим сценарием, я обновил вопрос, пожалуйста, посмотрите в него.
https://stackoverflow.com/questions/60043157/how-to-get-the-multiple-child-process-exit-status-whether-it-is-failed-or-succes/60045999#comment106212183_60045999
ad array: вам не нужно объявлять переменные, даже массивы, вы можете просто назначить (также элементам).
Закрыть X