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