Состояние выхода процесса Bash

286
TomyOne

Я хотел бы спросить о создании новых процессов в скрипте bash.

У меня есть скрипт, который будет выполнять тесты внешних программ, а затем проверять его состояние вывода и печатать, если тест прошел успешно или нет. Эти тесты будут выполняться последовательно.

И теперь мне нужно несколько других тестов, сценарий которых создает новый процесс для каждого из этих тестов. Максимальное количество процессов, скажем, на данный момент, скажем, я хочу запустить 3 теста параллельно и даже с первым последовательным выполнением тестов. И я хотел бы знать, есть ли возможность вернуть состояние вывода этих отдельных процессов в мой сценарий и записать их в журнал? Мне нужно получать эти значения отдельно от каждого запущенного процесса, и я не хочу останавливать эти последовательно запущенные процессы. И эти 3 теста будут работать в цикле с последовательными тестами.

Итак, для подведения итогов мне нужно как-то создать в bash скрипт регрессии, который будет работать в циклах TESTS1, при этом будет выполняться последовательно, и TESTS2, который будет работать в фоновом режиме, потому что их выполнение дольше, чем TESTS1. Но мне нужно как-то запустить TESTS2 в фоновом режиме, проверить, все ли еще работают, получить свой выходной статус обратно в родительский скрипт для регистрации значений и параллельно все еще выполняет TESTS1.

Теперь я использую ассоциативный массив для регистрации PID дочерних процессов TESTS2 и проверяю, запущен ли конкретный идентификатор теста, а если нет, запускаю его снова. Но я не знаю, как получить его удостоверение личности. потому что чтение последнего выходного состояния процесса не обязательно должно быть того теста, который я тестирую, существует.

 # Create array  declare -A processes for test in $; do processes[$test]=0 done # background prcess fork() { OUT=$($TEST) STATUS=$? if [ $STATUS -eq 0 ]; then # do staff if ok ((OK++))  else # do staff if fail ((FAIL++)) fi  }  # -----------------------------------------------------------------------------  # Repeat Tests i-times for ((i=1; i<=100; i++)) do # RUN backgroung proceses for TEST in $; do # check if PID lives kill -0 $ &> /dev/null stat=$?  # if 0 or not running run it... if [[ $ == 0 || $stat > 0 ]]; then  fork $TEST $cnt & processes[$TEST]=$! # log PID fi  done  # Cycle through TESTS1 for TEST in $; do OUT=$($TEST) STATUS=$? if [ $STATUS -eq 0 ]; then # do staff if ok ((OK++))  else # do staff if fail ((FAIL++)) fi echo -ne "** NOTE: Running Regress Tests: Cycle: $i PASS: $ccount FAIL: $fcount ...\r"  done 

Может у кого есть идеи? Спасибо

0

2 ответа на вопрос

0
l0b0

To get the exit code for a background process, use wait:

$ (sleep 1; false) & pid_1=$!; (sleep 1; true) & pid_2=$! [1] 29111 [2] 29112 $ wait $pid_1 $ echo $? 1 $ wait $pid_2 $ echo $? 0 
Да Спасибо, но ожидание остановит мой родительский сценарий и ожидает определенного процесса bg, и мне нужно выполнить другие тесты до сих пор и не ждать процессов bg. Мне нужно получить выходной статус, когда процесс bg заканчивается, и не ждать его окончания. TomyOne 10 лет назад 0
0
Ge2rt

How about writing the PIDs and output status to a temp file, e.g. via 'mktemp'. After finishing a TEST and checking its status, simply delete the temp file and create a new one when the next TEST runs. Or keep all the temp files for later reference and check the timestamps of the temp files to get the one related to the currently running TEST.