목표: 프로그램을 백그라운드에서(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_file
10초 후에 닫아야 합니다. 10초가 되기 전에 특수한 출력이 발생하면 expect
보다 일반적인 프로그램 출력 감지를 통해 해당 출력을 감지하고, 발생 시 프로그램을 닫거나 종료할 수 있습니다.