Linux
監控試圖訪問不存在的文件或目錄的程序
我們正在將網站從一種伺服器配置遷移到新配置,並且這些網站將使用與以前不同的路徑。我們正計劃努力通過並用新路徑替換舊路徑,但如果我們錯過任何路徑,是否有某種方法可以監視任何試圖訪問舊路徑的程序並知道該程序所擁有的 UID?
您可以使用這個小 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 的優點中,我們有:
- 對過程的干擾較小
- 系統範圍(不僅是受監控的程序),但您可以直接在腳本中減少其選擇
- 資源匱乏(僅顯示失敗的操作,而不是所有的 grep 之後)
- 您可以改進腳本以獲取有關呼叫程序的詳細資訊(例如,它的回溯、呼叫時間等…)。這取決於您的應用程序。
而對於缺點:
- 不是標準的,你必須安裝它(但標準足以在大多數發行版上可用)。在 Redhat 和變體上:
sudo yum install systemtap
- 需要有調試資訊來建構模組。在 Redhat 和變體上:
sudo debuginfo-install kernel
一些有用的連結:Tapset(包含的功能)索引和初學者指南
祝您遷移順利!