Перенаправление вывода из фонового процесса

Перенаправление вывода из фонового процесса

Цель: запустить программу в фоновом режиме (с PID), захватить PID, собрать выходные данные и завершить PID.

Мой код:

tee -a log | program | tee -a log &
PID=$!
disown $PID
sleep 10
pkill '^program*' 2> /dev/null

Я запустил несколько вариантов перенаправления, но, похоже, вывод не отправляется в «log».

Я также попробовал подход, упомянутый в другой теме, который рекомендовал использовать:

program &> log & 

Несмотря на то, что это работает нормально, похоже, что вывод «программы» не может быть захвачен.

«программа» также интерактивна, то есть в течение нескольких секунд она будет выводить команды, поэтому я установил sleep 10, чтобы дать ей достаточно времени для завершения.

Какие-нибудь советы?

Спасибо!

решение1

С 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

Который должен запустить программу в PTY, собрать ее вывод через вызов log_fileи через 10 секунд закрыть ее. Если есть отличительный вывод, который происходит до истечения 10 секунд, можно вместо этого обнаружить это и закрыть или убить программу, когда это произойдет, с помощью более типичного expectобнаружения вывода программы.

Связанный контент