私の質問は、次の質問に対して jbarlow によって投稿された回答に関連しています: redirect COPY of stdout to log file from within bash script
以下にリストされている推奨スクリプトを使用しました。私はbusyboxのbuildrootバージョンを使用しているため、完全なbashにアクセスできないため(jbarlowが指摘しているように)、これを使用する必要があります。
#!/bin/sh
if [ "$SELF_LOGGING" != "1" ]
then
PIPE=tmp.fifo
mkfifo $PIPE
# Keep PID of this process
SELF_LOGGING=1 sh $0 $* >$PIPE &
PID=$!
tee logfile <$PIPE &
# Safe to rm pipe because the child processes have references to it
rm $PIPE
wait $PID
# Return same error code as original process
exit $?
fi
私が見つけた問題は、このスクリプトから何かがフリーズする可能性があることです。たとえば、上記のコードを使用した凍結されたスクリプトのトレースは次のようになります。
Process 29750 attached - interrupt to quit
open("/tmp/tmp.fifo", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
write(2, "/usr/bin/runStuff", 24) = 24
write(2, ": ", 2) = 2
write(2, "line ", 5) = 5
write(2, "45", 2) = 2
write(2, ": ", 2) = 2
write(2, "can't open ", 11) = 11
write(2, "/tmp/tmp.fifo", 21) = 21
write(2, ": ", 2) = 2
write(2, "no such file", 12) = 12
write(2, "\n", 1) = 1
stat64("/sbin/tee", 0xbff7c20c) = -1 ENOENT (No such file or directory)
stat64("/usr/sbin/tee", 0xbff7c20c) = -1 ENOENT (No such file or directory)
stat64("/bin/tee", 0xbff7c20c) = -1 ENOENT (No such file or directory)
stat64("/usr/bin/tee", {st_mode=S_IFREG|0755, st_size=18956, ...}) = 0
_exit(1) = ?
Process 29750 detached
(これに関する知識が限られている私には)どのように見えるかは、tee が終了し、親スクリプトが終了していないことです。あれは正しいですか?もしそうなら、読み取り可能なファイルがないためにスクリプトが終了するのではないでしょうか? tee はバックグラウンド化されているため、明らかに親を制御できません。
背景として、死んだ場合にこれを繰り返し呼び出す別のプロセスがあります。そのため、同じファイルを使用すると、ロックアップ状態が発生する可能性があります。または、fifo が作成される前にrm が発生している可能性がありますか?
タイムアウトを指定して「読み取り」を使用することを検討しましたが、一度に何時間も何もログに記録されない状況が発生する可能性があります。
これがロックアップせず、fifo の端の1 つが停止した場合にスクリプトが停止するように、スクリプトを変更できますか?