目標:讓程式在背景運行(帶有 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
程式輸出檢測來檢測該輸出並在發生這種情況時關閉或終止程式。