PS検索が消える前にログから一時PIDを取得する

PS検索が消える前にログから一時PIDを取得する

監査ログを記入する一時的な事前接続プロセスがありますが、そのプロセスが何であるかわかりません。エラーログはPIDを提供しますが、間違っているとプロセスが終了するように見えるため、すぐに消えます。

私が望むのは、テールログを作成し、PIDをgrepして「ps -p」または「ps -ef |」にポンピングすることです。 PIDをgrep '。

私がこれまでに得たものは次のとおりです。

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

しかし、シェル拡張は更新されていないようです。つまり、コマンドを実行してログの最後のエントリで見つかったPIDが1234であると仮定すると、psはそのエントリを検索するだけで更新しません。

tailの出力をPSで無限に繰り返すか、PSでgrepingするさまざまなバリエーションを試しましたが、進歩はありませんでした。更新されたタイミングを確認するために別のウィンドウでログのtail -fを実行しましたが、そのPIDのPSを取得するコマンドが応答しませんでした。

誰でも私がやろうとしていることを達成する方法を提案できますか?

また、これを行うための非常に簡単で、よりよく、より確実な方法はありますか?私は経験がなく、仕事を複雑にする習慣があります。だから「なぜXだけしてはいけないのですか?」があるなら自由に投げてみてください!

とても感謝しています!雨。

答え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を1つのコマンドにまとめました。これは、「これまでのすべての一致を忘れてしまう」を意味する\KPCRE機能(によって有効になっています)です。一致する部分だけを印刷することと組み合わせて使用​​すると非常に便利です-P-o

上記のコードはエレガントではなく、多くのプロセスでCPUにスパムを送信しますが、迅速な確認には十分です。

関連情報