私たちはウェブサイトを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(含まれる機能)インデックス、そして初心者ガイド
移民に幸運を祈ります!