Ziel: Programm im Hintergrund laufen lassen (mit einem PID), PID erfassen, Ausgabe sammeln und PID beenden.
Mein Code:
tee -a log | program | tee -a log &
PID=$!
disown $PID
sleep 10
pkill '^program*' 2> /dev/null
Ich habe verschiedene Umleitungsoptionen ausgeführt, aber es gelingt mir nicht, die Ausgabe an „Log“ zu senden.
Ich habe auch einen Ansatz ausprobiert, der in einem anderen Thread erwähnt wurde und die Verwendung von Folgendem empfahl:
program &> log &
Auch wenn das problemlos läuft, scheint die Ausgabe des „Programms“ nicht erfasst werden zu können.
„Programm“ ist auch insofern interaktiv, als dass es für einige Sekunden Befehle ausgibt. Deshalb habe ich die Einstellung sleep 10 gewählt, um ihm genügend Zeit zum Beenden zu geben.
Irgendwelche Tipps?
Danke schön!
Antwort1
Mit expect
:
#!/usr/bin/env expect
package require Tcl 8.5
proc time_to_die {sid} {
close $sid
# if close is insufficient (e.g. the program is badly behaved) may
# need to instead get and blast away at the pid
#set pid [exp_pid $sid]
#exec kill $pid
exit
}
# spam output to this here file
log_file log
spawn -noecho TODOyourprogramhereFIXME
# and this here is in milliseconds
after 10000 [list time_to_die $spawn_id]
vwait godot
Das sollte das Programm in einem PTY ausführen, seine Ausgabe über den log_file
Aufruf sammeln und es nach 10 Sekunden schließen. Wenn es eine eindeutige Ausgabe gibt, die vor Ablauf der 10 Sekunden auftritt, könnte man dies stattdessen erkennen und das Programm schließen oder beenden, wenn dies mit einer typischeren expect
Erkennung der Programmausgabe geschieht.