バックグラウンドプロセスからの出力をリダイレクトする

バックグラウンドプロセスからの出力をリダイレクトする

目的: プログラムをバックグラウンドで実行し (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

関連情報