我正在调试运行时间较长并且仅生成日志文件作为可靠的完整输出的应用程序,因此通常我使用tail -f
来监视输出。由于还需要对环境变量进行一些特定的设置,因此我将包括tail -f LOGFILE &
在内的整个调用包装到了一个bash脚本中。
但是,这将创建一个tail
进程,该进程不会自动终止,并且将继续运行。使用trap
进行清理会导致代码复杂,一旦执行了多个清理任务,并且没有明显的方法可以解释脚本终止的所有方式。
使用timeout
命令,我可以将tail -f
限制为在固定的总时间后终止,但这会破坏某些情况,因为该情况下应该运行更长的时间。
所以我在想,是否有一种方法可以限制tail -f
使其终止,如果后面的文件在指定的时间内没有变化。
答案 0 :(得分:3)
更新:后续脚本在单独执行时对我有用,但是在某些情况下,尾部进程不会终止。尚不完全清楚tail -f
是否检测到正在管道传递的进程已终止。
如果没有内置解决方案,则可以在bash中产生基于stdout的超时,从而利用tail
将在stdout关闭的情况下终止。
# Usage: withTimeout TIMEOUT COMMAND [ARGS ...]
# Execute COMMAND. Terminate, if it hasn't produced new output in TIMEOUT seconds.
# Depending on the platform, TIMEOUT may be fractional. See `help read`.
withTimeout () {
local timeout="$1"; shift 1
"$@" | while IFS= read -r -t "${timeout}" line || return 0; do
printf "%s\n" "$line"
done
}
withTimeout 2 tail -f LOGFILE &
请注意,tail
如果无法使用inotify,可以每秒轮询一次文件。如果需要更快的输出,可以提供-s
选项。