【问题标题】:how to continue run script after tail -f command如何在tail -f命令后继续运行脚本
【发布时间】:2012-08-14 11:50:16
【问题描述】:

我有以下脚本:

tail -f nohup.out
echo 5

当我在 tail -f 上按 Ctrl+C 时,脚本停止运行:5 未打印。停止tail 命令后如何运行命令echo 5?

【问题讨论】:

    标签: bash signals tail


    【解决方案1】:

    Ctrl+C 向前台process group 中的所有进程发送SIGINT 信号。当tail 运行时,进程组由tail 进程和运行脚本的shell 组成。

    使用 trap 内置函数覆盖信号的默认行为。

    trap " " INT
    tail -f nohup.out
    trap - INT
    echo 5
    

    陷阱的代码什么都不做,因此如果外壳程序收到 SIGINT,它会继续执行下一个命令 (echo 5)。请注意,第一行的引号之间有一个空格;任何不做任何事情的 shell 代码都会做,除了一个空字符串,这意味着完全忽略信号(不能使用它,因为它会导致 tail 也忽略信号)。第二次调用trap 会恢复默认行为,因此在第三行之后,Ctrl+C 将再次中断脚本。

    【讨论】:

      【解决方案2】:
      #!/bin/bash
      trap "echo 5" SIGINT SIGTERM
      tail -f nohup.out
      

      【讨论】:

      • 不能trap SIGKILL,这里的SIGKILL 被忽略。这仅在 shell 收到 SIGINT 或 SIGTERM 时打印 echo 5,而不是在 tail 由于其他原因存在时(因为文件不存在,或者因为 tail 被显式杀死)。您可以添加伪信号EXIT,但这不是一种非常易读的方式来指定echo 5 将在tail 之后执行。
      【解决方案3】:

      您可以在新的 shell 中启动 tail,如下所示:

      #!/bin/bash
      bash -i -c 'tail -f nohup.out'
      echo 5
      

      【讨论】:

        【解决方案4】:

        如 rwos 所述,但添加了内联陷阱。

        bash -i -c "trap ' ' SIGINT; tail -F '$1'; trap - SIGINT"
        

        在发出后续 SIGINT 信号时,这将在不关闭腻子会话的情况下工作(这是我的问题)

        【讨论】:

          【解决方案5】:

          在 bash 中以单个 & 符号结束该行,以异步方式在后台运行命令

          tail -f nohup.out &
          

          【讨论】:

            【解决方案6】:

            在 perl 中查找 File:Tail,在不同的项目中使用过几次来自动跟踪日志并执行特定操作以输出日志。

            google ftp-upload-mon 我上传到 sourceforge 的一个项目,它使用 File:Tail to tail -f xferlogs

            【讨论】:

              猜你喜欢
              • 2017-07-17
              • 2022-10-14
              • 2017-10-31
              • 1970-01-01
              • 1970-01-01
              • 2016-11-19
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多