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
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)