【问题标题】:Bash: wait for process to exit while tailing log fileBash:在拖尾日志文件时等待进程退出
【发布时间】:2012-09-03 17:17:05
【问题描述】:

在 bash 脚本中,我正在使用 wait 等待子进程的 pid。该子进程正在写入日志文件。 bash 脚本中有没有办法在等待进程完成的同时将该日志文件尾随到标准输出?

【问题讨论】:

    标签: bash


    【解决方案1】:

    在后台运行猫:

    cmd-that-logs-to-file &
    pid=$!
    cat file &
    wait $pid
    kill $!  # Kill the cat
    

    【讨论】:

    • 如果在pid=$!之前和cmd-that-logs-to-file &之后启动了一些其他后台进程怎么办?
    • @KingsIndian 如果你没有记录 pid,那么你就不能可靠地等待一个特定的进程。
    • $! 给出了最近的后台进程的 id,它可能是别的东西。
    • @Kingsindian 我不明白你的意思。是的,如果您未能记录 $!在启动后台进程后立即,那么您没有该进程的 pid。这有什么关系?
    • @kingsindian $!实际上是指当前shell中的最后一个进程ID,而不是整个系统,所以那里真的没有竞争条件。文档可能看起来有点不清楚。但除此之外,$!不会有用,因为像你问的那样的竞争条件总是会发生
    【解决方案2】:

    在等待命令完成时,使用tail 命令跟踪文件。

    command &
    cmdpid=$!
    tail -f -n +0 logfile &
    wait $cmdpid
    kill $!
    

    这在本质上类似于 William 的解决方案,但有一个重要区别:如果 command 的完成时间比 cat 打印文件的时间长,它将正确打印日志文件(很可能,因为cat 非常快)。 -n +0 选项告诉tail 在开始更新之前打印整个文件。

    【讨论】:

      【解决方案3】:

      这使它更简单:

      command &
      pid=$!
      tail --pid=$pid -f /path/to/log
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-09-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多