存在しないファイルまたはディレクトリにアクセスしようとするプロセスを監視します。

存在しないファイルまたはディレクトリにアクセスしようとするプロセスを監視します。

私たちはウェブサイトを1つのサーバー構成から新しい構成に移行しており、ウェブサイトは以前とは異なるパスにあります。古いパスを慎重に確認して新しいパスに置き換える予定ですが、欠落している場合は、古いパスにアクセスするプロセスを監視し、そのプロセスのUIDが何であるかを知る方法はありますか?

ベストアンサー1

この小さなsystemtapスクリプトを使用できます。

#!/usr/bin/stap
function proc:string() { return sprintf("PID(%d) UID(%d) PROC(%s)", pid(), uid(), execname()) }

probe syscall.open.return, syscall.stat.return,
  syscall.open64.return ?, syscall.stat64.return ? {
  filename = user_string($filename)
  if ($return < 0) {
    printf("failed %s on %s by %s\n", pn(), proc(), filename)
  }
}

システムコールを開き、返却時に統計をフックします(コードをコピー/貼り付けることができます。他のシステムコールを忘れた可能性があります)。システムコールはカーネルと通信する唯一の方法なので、何も見逃すことはありません。スクリプトは次の出力を生成します。

failed syscall.stat.return on PID(4203) UID(1000) PROC(bash) by /tmp/rofl
failed syscall.stat.return on PID(4203) UID(1000) PROC(bash) by /tmp/hihi

systemtapを使用する利点は次のとおりです。

  • プロセス中断の削減
  • システム全体(監視対象のプロセスだけでなく)では、スクリプトから直接選択を減らすことができます。
  • リソース集約度が低い(すべてのジョブの後にgrepingする代わりに失敗したジョブのみを表示)
  • 呼び出しプログラムに関する詳細情報(トレース、呼び出し時間など)を取得するためにスクリプトを改善できます。あなたのアプリケーションによって異なります。

欠点は次のとおりです。

  • 標準ではないため、インストールする必要があります(ただし、ほとんどのディストリビューションで動作するのに十分な標準です)。 Redhatと亜種の場合:sudo yum install systemtap
  • モジュールをビルドするには、デバッグ情報が必要です。 Redhatと亜種の場合:sudo debuginfo-install kernel

便利なリンク:Tapset(含まれる機能)インデックス、そして初心者ガイド

移民に幸運を祈ります!

おすすめ記事