列出程序訪問的文件
time
如果您想弄清楚給定命令需要多少 CPU 時間,這是一個絕妙的命令。我正在尋找類似的東西,可以列出程序及其子程序正在訪問的文件。可以是實時的,也可以是事後的報告。
目前我使用:
#!/bin/bash strace -ff -e trace=file "$@" 2>&1 | perl -ne 's/^[^"]+"(([^\\"]|\\[\\"nt])*)".*/$1/ && print'
但如果執行的命令涉及
sudo
. 它不是很智能(如果它只能列出現有文件或存在權限問題的文件,或者將它們分組為讀取的文件和寫入的文件,那就太好了)。也strace
很慢,所以選擇更快會更好。
我放棄並編寫了自己的工具。引用其文件:
SYNOPSIS tracefile [-adefnu] command tracefile [-adefnu] -p pid OPTIONS -a List all files -d List only dirs -e List only existing files -f List only files -n List only non-existing files -p pid Trace process id -u List only files once
它只輸出文件,因此您不需要處理來自
strace
.https://gitlab.com/ole.tange/tangetools/tree/master/tracefile
您可以使用 跟踪系統呼叫
strace
,但確實存在不可避免的速度損失。strace
如果命令以提升的權限執行,則需要以root 身份執行:sudo strace -f -o foo.trace su user -c 'mycommand'
另一種可能更快的方法是預載入一個包含文件系統訪問函式的庫:
LD_PRELOAD=/path/to/libmywrapper.so mycommand
.LD_PRELOAD
環境變數不會傳遞給使用提升權限呼叫的程序。您必須編寫該包裝庫的程式碼(這裡有一個來自“為樂趣和利潤而建構庫插入器”的範例);我不知道網路上是否有可重用的程式碼。如果您正在監視特定目錄層次結構中的文件,則可以使用LoggedFS 創建文件系統視圖,以便記錄通過該視圖的所有訪問。
loggedfs -c my-loggedfs.xml /logged-view mycommand /logged-view/somedir
要配置 LoggedFS,請從程序附帶的範例配置開始,並閱讀LoggedFS 配置文件語法。
另一種可能性是 Linux 的審計子系統。確保
auditd
守護程序已啟動,然後配置您要使用的日誌記錄auditctl
。每個記錄的操作都記錄在/var/log/audit/audit.log
(在典型分佈上)。要開始觀看特定文件:auditctl -a exit,always -w /path/to/file
如果你在一個目錄上放置一個監視,那麼它及其子目錄中的文件也會被遞歸監視。注意不要觀看包含審計日誌的目錄。您可以將日誌記錄限製到某些程序,請參閱
auditctl
可用過濾器的手冊頁。您需要是 root 才能使用審計系統。