在 PS 搜索消失之前从日志中获取瞬态 PID

在 PS 搜索消失之前从日志中获取瞬态 PID

我有一个临时的预链接进程填充我们的审核日志,但我们不确定该进程是什么。错误日志为我们提供了 PID,但它几乎立即消失,因为我猜进程在出错时就会结束。

我想要做的是尾部日志,grep 出 PID,并将其泵入“ps -p”或“ps -ef |”。 grep PID'.

到目前为止我得到的是:

ps -p $(tail -f /var/log/audit/audit.log | grep 'comm="prelink"' | grep -o 'pid=[0-9]* ' | grep -o [0-9]*)

但我认为 shell 扩展没有更新,即我运行命令,它从日志的最后一个条目中找到的 PID 是,比如说 1234,然后 ps 只会搜索它,并且不会更新。

我尝试过将尾部的输出无限循环到 PS 或 PS 的 grep 中的各种变体,但我没有取得任何进展。我在另一个窗口中单独运行日志的 tail -f 来查看它何时更新,确实如此,但是为该 PID 抓取 PS 的命令没有反应。

谁能建议一种方法来实现我想要做的事情?

另外,有没有一种非常简单、更好、明显的方法来做到这一点?我不是很有经验,而且我有把事情过度复杂化的习惯,所以如果你有一个“为什么不干脆X”,请随意把它扔进去!

多谢多谢! B.

答案1

您应该始终引用诸如 之类的表达式[0-9]*

tail -f /var/log/audit/audit.log |
  grep --line-buffered 'comm="prelink"' |
  grep --line-buffered -o 'pid=[0-9]* ' |
  grep --line-buffered -o '[0-9]*' |
  while read pid; do
    ps -p "$pid"
  done

tail -f不缓冲其输出。对于其他应用unbuffer还是stdbuf解决问题。

答案2

您始终可以无限循环地运行它并避免缓冲问题。由于您可能不会长时间运行它并且可以手动停止它,因此只需运行

while true; do
    ps -p $( tail -n1 /var/log/audit/audit.log | 
             grep -oP 'comm="prelink".*pid=\K[0-9]*' ) 2>/dev/null

这将不断地打印文件的最后一行,提取 PID(如果有)并ps -p对其运行。如果没有 PID,它会抱怨,所以你需要重定向错误输出。我还将您的 grep 组合成一个命令。这\K是 PCRE 功能(由 启用-P),意思是“忘记到目前为止所有匹配的内容”。与-o仅打印匹配的部分内容相结合非常有用。

上面的代码并不优雅,它会用许多进程向您的 CPU 发送垃圾邮件,但对于快速检查来说应该足够了。

相关内容