是否可以监控所有程序访问不存在的文件?

Is it possible to monitor all programs for accessing a file that does not exist?

我有一个由 php 通过 PDO 连接(因此由 Apache)启动的数据库驱动程序。此驱动程序正在寻找一个它找不到的文件,但我不知道它在哪里搜索以便将文件放在那里。

但是是否可以监控整个系统的文件访问,尤其是对不存在的文件的访问?

当我在 apache 的 httpd 的 pid 上使用 strace 时,只有不相关的输出。

strace -e trace=open,close,read,write,connect,accept -f -s 1024 -p1234

实际的 db 驱动进程的生命周期太短,当它是 运行 时无法附加 strace,所以我不能使用它。

另一种可能性是:

lsof -r 2 | grep the_file_name

但这不会输出不存在的文件。

是否有其他命令可以监控"globally"?

监视 non-existant 文件访问是棘手的。内核有 inotify API 来监视文件更改,但它不能用于访问 non-existant 文件。一种可能的方法是挂钩 open() 系统调用。

更简单的解决方案是直接在前台使用 strace 启动 httpd,这样就不会错过任何呼叫。 来自我本地的 debian box 的示例。先停止服务,然后:

source /etc/apache2/envvars 
strace -e trace=open,close,read,write,connect,accept -ff -s 1024 /usr/sbin/apache2 -DFOREGROUND -k start

在另一个终端发出请求,输出将显示进行的系统调用:

curl localhost:80/test -v

回复:

[pid 25419] read(32, "GET /test HTTP/1.1\r\nHost: localhost\r\nUser-Agent: curl/7.47.0\r\nAccept: */*\r\n\r\n", 8000) = 77
[pid 25419] open("/.htaccess", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
[pid 25419] open("/var/.htaccess", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
[pid 25419] open("/var/www/.htaccess", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
[pid 25419] open("/var/www/html/.htaccess", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
[pid 25419] read(32, 0x7fa39685b048, 8000) = -1 EAGAIN (Resource temporarily unavailable)
[pid 25419] write(27, "::1 - - [23/Jul/2019:18:35:59 +0200] \"GET /test HTTP/1.1\" 404 438 \"-\" \"curl/7.47.0\"\n", 84) = 84
[pid 25419] read(32, "", 8000)          = 0
[pid 25419] read(32, "", 512)           = 0
[pid 25419] close(32)                   = 0
[pid 25419] read(5, 0x7fffc7a4a0df, 1)  = -1 EAGAIN (Resource temporarily unavailable)