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

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

2 ответа2

0

Чтобы получить код выхода для фонового процесса, используйте 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
0

Как насчет записи PID и статуса вывода во временный файл, например, через «mktemp». После завершения TEST и проверки его состояния просто удалите временный файл и создайте новый при следующем запуске TEST. Или сохраните все временные файлы для последующего использования и проверьте временные метки временных файлов, чтобы получить метку, связанную с текущим запущенным тестом.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .