Files

列出程序訪問的文件

  • July 9, 2020

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 才能使用審計系統。

引用自:https://unix.stackexchange.com/questions/18844