Я хотел бы спросить о создании новых процессов в скрипте bash.
У меня есть скрипт, который будет выполнять тесты внешних программ, а затем проверять его состояние вывода и печатать, если тест прошел успешно или нет. Эти тесты будут выполняться последовательно.
И теперь мне нужно несколько других тестов, сценарий которых создает новый процесс для каждого из этих тестов. Максимальное количество процессов, скажем, на данный момент, скажем, я хочу запустить 3 теста параллельно и даже с первым последовательным выполнением тестов. И я хотел бы знать, есть ли возможность вернуть состояние вывода этих отдельных процессов в мой сценарий обратно и записать их в журнал? Мне нужно получать эти значения отдельно от каждого запущенного процесса, и я не хочу останавливать эти последовательно запущенные процессы. И эти 3 теста будут работать в цикле с последовательными тестами.
Итак, для подведения итогов мне нужно как-то создать в bash скрипт регрессии, который будет работать в циклах TESTS1, при этом будет выполняться последовательно, и TESTS2, который будет работать в фоновом режиме, потому что их выполнение дольше, чем TESTS1. Но мне нужно как-то запустить TESTS2 в фоновом режиме, проверить, все ли еще работают, вернуть свой выходной статус обратно в родительский скрипт для регистрации значений и параллельно все еще выполнять TESTS1.
Теперь я использую ассоциативный массив для регистрации PID дочерних процессов TESTS2 и проверяю, запущен ли конкретный идентификатор теста, а если нет, запускаю его снова. Но я не знаю, как получить его удостоверение личности. потому что чтение последнего выходного состояния процесса не обязательно должно быть того теста, который я тестирую, существует.
# Create array
declare -A processes
for test in ${TESTS2[@]};
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 ${TESTS2[@]}; do
# check if PID lives
kill -0 ${processes[$TEST]} &> /dev/null
stat=$?
# if 0 or not running run it...
if [[ ${processes[$TEST]} == 0 || $stat > 0 ]]; then
fork $TEST $cnt &
processes[$TEST]=$! # log PID
fi
done
# Cycle through TESTS1
for TEST in ${TESTS1[@]}; 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
Может у кого есть идеи? Спасибо