我有一个临时的预链接进程填充我们的审核日志,但我们不确定该进程是什么。错误日志为我们提供了 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 发送垃圾邮件,但对于快速检查来说应该足够了。