是否可以监控所有程序访问不存在的文件?
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)
我有一个由 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)