Status de saída do processo Bash

0

Gostaria de perguntar sobre a criação de novos processos no script bash.

Eu tenho um script que executa testes de programas externos e, em seguida, verifica seu status de saída e imprime se o teste foi bem-sucedido ou não. Estes testes serão executados sequencialmente.

E agora eu preciso de alguns outros testes cujo script criará um novo processo para cada um desses testes. Processos máximos de quantos testes existem, por enquanto eu quero executar 3 testes em paralelo e até mesmo com execuções de testes primeiro sequencialmente. E gostaria de saber se existe alguma forma de obter o status de saída desses processos separados para meu script e registrá-los? Eu preciso obter esses valores separadamente de cada processo em execução E eu não quero parar esses processos em execução sequencialmente. E esses 3 testes estarão funcionando ainda em ciclos com testes sequenciais.

Então, para resumir eu preciso de bash de alguma forma criar script de regressão que será executado em ciclos TESTS1 whill será executado sequencialmente e TESTS2, que será executado em segundo plano porque sua execução é mais longa, em seguida, TESTS1. Mas eu preciso de alguma forma para executar TESTS2 em backround, verifique se ainda estão em execução obter o seu status de saída de volta ao script pai para registrar valores e em paralelo ainda executando TESTS1.

Agora estou usando o array associativo para registrar o PID de processos filhos do TESTS2 e testar se um determinado ID de teste está sendo executado e, se não, eu inicio novamente. Mas eu não não como obter o seu ID. porque a leitura do último status de saída do processo não precisa ser deste teste que estou testando existe.

     # 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

Alguém pode ter alguma ideia? Obrigado

    
por TomyOne 19.11.2014 / 10:36

2 respostas

0

Para obter o código de saída para um processo em segundo plano, 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
    
por 19.11.2014 / 10:44
0

Que tal escrever os PIDs e o status de saída para um arquivo temporário, por exemplo, via 'mktemp'. Depois de terminar um TESTE e verificar seu status, simplesmente exclua o arquivo temporário e crie um novo quando o próximo TESTE for executado. Ou mantenha todos os arquivos temporários para referência futura e verifique os registros de data e hora dos arquivos temporários para obter o relacionado ao TEST atualmente em execução.

    
por 19.11.2014 / 11:34