백그라운드 프로세스에서 출력 리디렉션

백그라운드 프로세스에서 출력 리디렉션

목표: PID를 사용하여 백그라운드에서 프로그램을 실행하고, PID를 캡처하고, 출력을 수집하고, PID를 종료합니다.

내 코드:

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

다양한 리디렉션 옵션을 실행했지만 출력이 "로그"로 전송되지 않는 것 같습니다.

나는 또한 다음의 사용법을 권장하는 다른 스레드에서 언급된 접근 방식을 시도했습니다.

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_file10초 후에 프로그램을 닫아야 합니다. 10초가 되기 전에 독특한 출력이 발생하는 경우 대신 이를 감지하고 보다 일반적인 expect프로그램 출력 감지를 통해 해당 출력이 발생하면 프로그램을 닫거나 종료할 수 있습니다 .

관련 정보