
Mit einem bash
Skript 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 "$@"