【问题标题】:Cancel "tail -f" if the file hasn't changed for N seconds?如果文件在 N 秒内没有更改,取消“tail -f”?
【发布时间】:2019-12-20 09:40:42
【问题描述】:

我正在调试一个应用程序,它运行时间很长并且只生成一个日志文件作为可靠的完整输出,所以我通常使用tail -f 来监控输出。由于它还需要对环境变量进行一些特定设置,因此我将整个调用(包括 tail -f LOGFILE &)包装到了一个 bash 脚本中。

但是,这会创建一个tail 进程,该进程不会自动终止,而是会继续运行。使用trap 进行清理会导致代码复杂,一旦有多个清理任务,并且没有明显的方法来说明脚本可能终止的所有方式。

使用timeout 命令,我可以限制tail -f 在固定的总时间后终止,但这会破坏应该运行更长时间的情况。

所以我想知道,是否有办法限制tail -f 使其终止,如果跟随的文件在指定的时间内没有更改。

【问题讨论】:

    标签: bash timeout tail


    【解决方案1】:

    更新:后续脚本在单独执行时对我有用,但在某些情况下,尾部进程无论如何都不会终止。尚不完全清楚,tail -f 是否检测到它正在传输的进程已终止。


    缺少内置解决方案,可以在 bash 中产生基于标准输出的超时,利用 tail 将终止,如果它的标准输出关闭。

    # 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 选项。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-16
      • 1970-01-01
      • 1970-01-01
      • 2021-12-19
      • 2012-07-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多