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

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

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

내 코드:

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

다양한 리디렉션 옵션을 실행했지만 출력을 "로그"로 가져올 수 없는 것 같습니다.

또한 다른 스레드에서 언급한 방법을 시도했는데 다음을 사용하는 것이 좋습니다.

program &> log & 

제대로 작동하지만 "프로그램"의 출력을 캡처하지 못하는 것 같습니다.

"프로그램"은 또한 대화형이며 몇 초 안에 명령을 출력하므로 완료하는 데 충분한 시간을 주기 위해 수면 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보다 일반적인 프로그램 출력 감지를 통해 해당 출력을 감지하고, 발생 시 프로그램을 닫거나 종료할 수 있습니다.

관련 정보