Espere a que el proceso en primer plano emita una cadena y luego envíelo al fondo

Espere a que el proceso en primer plano emita una cadena y luego envíelo al fondo

Con un bashscript en el que estoy intentando iniciar un proceso, espero a que escriba una cadena específica stdout(es decir 'Server Initialized'), luego lo envío a un segundo plano y continúo con el script. Aún mejor si una vez 'Server Initialized'impreso el resultado del proceso se ignora (¿se redirige a /dev/null?)

Como truco, en este momento estoy esperando 10 segundos y asumiendo que el servidor se ha iniciado.

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

Puntos de bonificación si, después de un tiempo de espera, la cadena de búsqueda no aparece, salga con un código de estado de error.

Respuesta1

La idea es ejecutar el servidor en segundo plano y luego registrar su salida siempre que aparezca la cadena esperada 'Something 3'( 'Server Initialized'en su 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 "$@"

información relacionada