当出现特定文本时中断并重新启动 Linux 命令

当出现特定文本时中断并重新启动 Linux 命令

为了尽可能简化情况,假设我正在跟踪一个日志文件,当应用程序关闭时,该文件会被轮换出去。由于文件发生变化,跟踪会停止。为了继续跟踪,需要键盘中断,然后再次运行命令。以下是一个例子:

$ tail -f some-log-file.log
log line
log line
...etc...
log line
log line
Some app restarting...
^C
$ tail -f some-log-file.log
log line
log line
...etc...

因此,我希望找到一种简单的方法,在遇到“某个应用程序正在重新启动...”文本时重新启动尾部。我想过可以编写程序来监视进程或类似程序,但我觉得这应该可以作为一行或简短的 bash 脚本来实现。有什么想法吗?

答案1

while true; do
  sed '/Some app restarting/q' <(exec tail -f some-log-file.log)
  kill -9 $!
done

以下是其具体功能:

  • while true; do:开始无限循环
  • sed '/Some app restarting/q':将其输入发送到其输出,并在收到“某个应用程序正在重新启动”时终止
  • <(command): 跑步命令在后台的子 shell 中,将其输出提供给上一个命令
  • exec:用以下命令替换(子)shell,而不是分叉运行它
  • kill -9 $!:终止最近启动的后台进程,即 tail -f (如果没有这个,它似乎可以工作,但每次应用程序重新启动时都会永久留下一个 tail 进程)
  • done:结束无限循环

相关内容