列出程序访问的文件

Ole*_*nge 77 monitoring files strace

time 如果您想弄清楚给定命令需要多少 CPU 时间,这是一个很棒的命令。

我正在寻找类似的东西,可以列出程序及其子项正在访问的文件。实时或事后报告。

目前我使用:

#!/bin/bash

strace -ff -e trace=file "$@" 2>&1 | perl -ne 's/^[^"]+"(([^\\"]|\\[\\"nt])*)".*/$1/ && print'
Run Code Online (Sandbox Code Playgroud)

但如果要运行的命令涉及sudo. 它不是很智能(如果它只能列出存在的文件或有权限问题的文件,或者将它们分组为读取的文件和写入的文件,那就太好了)。也strace很慢,所以选择更快的会更好。

Ole*_*nge 65

我放弃并编写了自己的工具。引用其文档:

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
Run Code Online (Sandbox Code Playgroud)

它只输出文件,因此您无需处理strace.

https://gitlab.com/ole.tange/tangetools/tree/master/tracefile

  • 不错的工具。打包,安装:`yum -y install https://extras.getpagespeed.com/release-el7-latest.rpm` 和 `yum -y install tr​​acefile` (7认同)
  • @Xerus 克隆 https://gitlab.com/ole.tange/tangetools 并运行 `make && sudo make install`。然后你可以运行“man tracefile”。 (2认同)

Gil*_*il' 30

您可以使用 跟踪系统调用strace,但确实存在不可避免的速度损失。strace如果命令以提升的权限运行,您需要以root 身份运行:

sudo strace -f -o foo.trace su user -c 'mycommand'
Run Code Online (Sandbox Code Playgroud)

另一种可能更快的方法是预加载一个包含文件系统访问函数的库:LD_PRELOAD=/path/to/libmywrapper.so mycommand. 该LD_PRELOAD环境变量不会被传递到与提升的权限调用程序。您必须编写该包装器库的代码(这是“为乐趣和利润而构建库中介层”中的一个示例);不知道网上有没有可重用的代码。

如果您正在监视特定目录层次结构中的文件,则可以使用LoggedFS查看文件系统,以便记录通过该视图进行的所有访问。

loggedfs -c my-loggedfs.xml /logged-view
mycommand /logged-view/somedir
Run Code Online (Sandbox Code Playgroud)

要配置 LoggedFS,请从程序附带的示例配置开始,并阅读LoggedFS 配置文件语法

另一种可能性是 Linux 的审计子系统。确保auditd守护进程已启动,然后配置要使用auditctl. 每个记录的操作都记录在/var/log/audit/audit.log(在典型分布上)。要开始观看特定文件:

auditctl -a exit,always -w /path/to/file
Run Code Online (Sandbox Code Playgroud)

如果您将监视放在目录上,则也会监视其中的文件及其子目录递归。注意不要查看包含审计日志的目录。您可以将日志记录限制为某些进程,请参阅auditctl可用过滤器的手册页。您需要成为 root 用户才能使用审计系统。


unc*_*mil 11

我想你想要 lsof (可能通过管道传输到程序上的 grep 和它的孩子)。它会告诉您当前在文件系统上访问的每个文件。有关进程访问哪些文件的信息(来自此处):

lsof -n -p `pidof your_app`
Run Code Online (Sandbox Code Playgroud)

  • 但它只给了我一个快照。我需要的是它试图访问的文件。想想程序拒绝启动的情况,因为它说“缺少文件”。我如何找出它正在寻找的文件? (15认同)