Warten Sie, bis der Vordergrundprozess eine Zeichenfolge ausgibt, und senden Sie diese dann an den Hintergrund

Warten Sie, bis der Vordergrundprozess eine Zeichenfolge ausgibt, und senden Sie diese dann an den Hintergrund

Mit einem bashSkript versuche ich, einen Prozess zu starten, darauf zu warten, dass er eine bestimmte Zeichenfolge in schreibt stdout(z. B. ), und ihn dann in den Hintergrund zu senden und mit dem Skript fortzufahren. Noch besser ist es, wenn die Prozessausgabe 'Server Initialized'nach dem Drucken ignoriert wird (umgeleitet an ?).'Server Initialized'/dev/null

Als Hack warte ich im Moment 10 Sekunden und gehe davon aus, dass der Server gestartet ist.

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

Bonuspunkte gibt es, wenn der Suchbegriff nach einer gewissen Zeitüberschreitung nicht angezeigt wird. In diesem Fall wird das Programm mit einem Fehlerstatuscode beendet.

Antwort1

Die Idee besteht darin, den Server im Hintergrund laufen zu lassen und dann seine Ausgabe zu greppen, bis die erwartete Zeichenfolge angezeigt wird 'Something 3'( 'Server Initialized'in Ihrem Fall).

#!/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 "$@"

verwandte Informationen