Aguarde que o processo de primeiro plano emita a sequência e, em seguida, envie para o segundo plano

4

Com um script bash Estou tentando iniciar um processo, aguarde que ele grave uma string específica para stdout (ou seja, 'Server Initialized' ) e, em seguida, envie-a para o segundo plano e continue com o script. Melhor ainda se uma vez 'Server Initialized' for impressa, a saída do processo é ignorada (redirecionada para /dev/null ?)

Como um hack agora eu estou esperando 10 segundos e assumindo que o servidor tenha iniciado.

( ./long_running_process ) > /dev/null 2>&1 &
# sleep 10
echo 'I run after long_running_process prints "Server Initialized"

Pontos de bônus se, após algum tempo limite, a sequência de pesquisa não aparecer, saia com um código de status de erro.

    
por plemarquand 22.09.2016 / 04:30

1 resposta

1

A idéia é executar o servidor em segundo plano e, em seguida, fazer o grep em sua saída, contanto que a string esperada apareça em 'Something 3' ( 'Server Initialized' no seu caso)

#!/bin/bash

main()  
{
    output=$(mktemp "${TMPDIR:-/tmp/}$(basename 0).XXX")
    server &> $output &
    server_pid=$!
    echo "Server pid: $server_pid"
    echo "Output: $output"
    echo "Wait:"
    until grep -q -i 'Something 3' $output
    do       
      if ! ps $server_pid > /dev/null 
      then
        echo "The server died" >&2
        exit 1
      fi
      echo -n "."
      sleep 1
    done
    echo 
    echo "Server is running!" 
}

server() 
{       
    i=0
    while true; do
      let i++
      echo "Something $i"  
      sleep 1
    done
}

main "$@"
    
por 11.11.2016 / 11:51