バックグラウンドプロセスを安全に終了

バックグラウンドプロセスを安全に終了

親プロセスのパイプにデータを書き込んでいます。親プロセスはパイプからデータを読み取り、それを画面とログファイルに書き込むバックグラウンドジョブを作成します。
バックグラウンドタスクをいつ終了する必要があるのか​​どうかはどうすればわかりますか?waitコマンドは永遠に待ちます。 「出力の終わり」を検出するためにトークンを使用したくありません。コード例:

function log()
{
    if [ -z "$counter" ]; then
        counter=1
    else
        (( ++counter ))
    fi

    if ! [[ -z "$teepid" ]]; then
        # ***** How can I know if it's safe to kill here?
        kill $teepid
    fi
    # Display text-to-be-logged on screen
    #  & write text-to-be-logged to it's corresponding log file
    tee <"$pipe" 1>&4 "${logs_dir}/${counter}_${1// /_}" &
    teepid=$!
}

logs_dir="/path/to/log/dir"

pipe_dir=$(mktemp -d)
pipe="${pipe_dir}/cmds_output"
mkfifo "$pipe"
exec 3<>"$pipe" # link file descriptor (FD) #3 to $pipe for r/w
exec 4<&1   # save value of FD1 to FD4
exec 1>&3   # redirect all output to FD3

log # Logs the following code block
{
    # ... Many bash commands ...
}

log # Logs the following code block
{
    # ... Many bash commands ...
}

if ! [[ -z "$teepid" ]]; then
    # ***** How can I know if it's safe to kill here? Maybe it's still logging
    kill $teepid;
fi

編集する:

私は試した:

exec 3>&-
#exec 1>&- # Have tried also uncommenting this row
wait $teepid
exec 3<>"$pipe"
exec 1>&3
kill $teepid

ところで、waitコマンドは停止し続けます...ps -o pid,ppid,s --pid $teepidプロセスステータスが表示されることがわかりました。これを信じなければなりませんか?

ベストアンサー1

完了したらパイプを閉じます。子プロセスはEOFに達して終了する必要があります。

おすすめ記事