我的问题与 jbarlow 对以下问题的回答有关: redirect COPY of stdout to log file from inside bash script itself
我使用了下面列出的建议脚本。我必须使用它,因为我无法访问完整的 bash(正如 jbarlow 指出的那样),因为我使用的是 buildroot 版本的busybox。
#!/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
我发现的问题是,该脚本似乎会冻结某些内容。例如,使用上述代码的冻结脚本的 strace 如下所示:
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 是背景的,因此显然无法控制父级。
作为背景,如果它死了,还有另一个进程会重复调用它。因此,使用相同的文件可能会导致锁定情况。或者 rm 可能在创建 fifo之前发生?
我已经考虑过使用带有超时的“读取”,但在某些情况下,一次几个小时都没有记录任何内容。
是否可以修改脚本以使其不会锁定并且如果/当fifo 的一端死亡时脚本将死亡?