親プロセスのパイプにデータを書き込んでいます。親プロセスはパイプからデータを読み取り、それを画面とログファイルに書き込むバックグラウンドジョブを作成します。
バックグラウンドタスクをいつ終了する必要があるのかどうかはどうすればわかりますか?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に達して終了する必要があります。