2017-06-08 2 views
0

Ich habe Bash-Skript, das einen lang laufenden Prozess, der eine Menge Zeug auf stdout druckt ausgeführt wird. Ich habe das Skript die Prozessausgabe erst nach dem Abschluss und nur dann drucken lassen, wenn es fehlgeschlagen ist.Beispiel launched Prozesse ist lebendig und Code

Mein Problem ist, dass einige CI erfordern einige Stdout Drucke alle X Minuten und der Prozess manchmal viel mehr als diese X Minuten.

Ich versuche, von bash Lösung zu denken, das wäre:

  1. Lauf der Prozess und die Aufhebung des stdout zu halten.
  2. Während der Prozess läuft, drucken Sie "." um alle X Sekunden anzuzeigen - um zu signalisieren, dass das Skript noch läuft.
  3. Nachdem der Prozess abgeschlossen ist, wird es in der Lage sein, seinen Exit-Code zu erhalten und entsprechend neu zu schreiben.

Hier ist das, was ich mit dem Schreiben begonnen:

run_process > output.txt 2>&1 & my_pid=$! 
exited=0 
while [ ${exited} -eq 0 ] 
do 
    timeout wait 5s ${my_pid};exit_code=$?;exited=1 
    echo . 
done 

deutlich, die nicht da Timeout funktioniert nicht eine Reihe von Befehlen bekommen. Haben Sie andere Lösungen?

+0

Was ist '& mypid = $' Ich gehe davon aus Sie ein Semikolon oder Newline fehlen? – SaintHax

+0

Es sollte 'mypid = $!' Sein. '$!' gibt die PID des letzten in den Hintergrund gesetzten Prozesses zurück. – Jack

+0

Außerdem denke ich, dass '-nq'' -eq' sein sollte. – Jack

Antwort

0

Try this:

run_process > output.txt 2>&1 & my_pid=$! 
while ps -p $my_pid > /dev/null; do 
    echo -n . 
    sleep 5 
done 

Get Exit-Wert von wait:

wait $mypid 
echo $? 
+0

danke! aber ich brauche eine Lösung, die beide kombiniert :-) (warten Sie auf einen Prozess beim Drucken von Punkten, und dann erhalten Sie den Exit-Code) –

+0

Gerade hinzugefügt den Teil über den Exit-Code! – Jack

+0

Wenn der untergeordnete Prozess bereits beendet wurde, wird 'wait' sofort mit dem Beendigungscode des untergeordneten Prozesses zurückgegeben. – Jack