重定向后台进程的输出

重定向后台进程的输出

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

相关内容