目标:让程序在后台运行(带有 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
程序输出检测来检测该输出并在发生这种情况时关闭或终止程序。