Ausgabe vom Hintergrundprozess umleiten

Ausgabe vom Hintergrundprozess umleiten

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_fileAufruf 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 expectErkennung der Programmausgabe geschieht.

verwandte Informationen