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