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
Я хотел бы спросить о создании новых процессов в скрипте 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
Может у кого есть идеи? Спасибо
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
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.