我有一个我正在尝试运行的程序,但是当我运行它时;它只是抱怨它找不到特定的文件。
但是我不知道它试图在哪个文件夹中找到这个特定文件。我有一个所需文件的副本,我只需要知道要复制哪个文件夹。
有什么方法可以实时显示哪些文件正在被访问,哪些文件正在尝试访问和访问失败?
如果有帮助,我正在使用 Ext4 文件系统。
谢谢
小智 11
(我首先在这个askubuntu question 上发布了我的答案,但从那里删除并发布在这里,因为它更相关。)
有几种方法可以调查哪些文件和库进程打开了;主要工具是lsof、strace和ltrace。有时需要使用 来运行它们sudo,因此程序可以访问它所需的一切,以获取程序调用内容的准确快照。
1)随着lsof你需要找到你要查询的进程id,所以使用,例如:
lsof -c firefox
Run Code Online (Sandbox Code Playgroud)
它将列出所有firefox已打开的文件及其对系统共享库的所有调用。(Firefox 目前在我的系统上的 pid 为 3310,因此您也可以使用lsof -p 3310,但您必须首先使用 查找进程 ID ps aux | grep [f]irefox
)。lsof这篇有用的IBM 文章中详细介绍了有关 的更多信息。
2)ltrace并且strace具有非常相似的功能和选项,对于查找有关进程正在进行的调用的详细信息非常有用。主要区别在于ltrace通常只跟踪library调用(尽管它可以使用-S选项跟踪系统调用),而strace跟踪两者library和其他system调用。这篇 IBM 文章中提供了有关跟踪进程的更多信息。Lsof如果您想检查已经运行的进程,但strace也可以执行此操作并在给定进程 pid 时实时监视调用,则可能对您更有用(sudo 在附加到进程时始终使用):
sudo strace -p 3310
Run Code Online (Sandbox Code Playgroud)
但是启动程序strace并查看调用的内容会更有用,如下例所示:
strace -f -e trace=open /usr/bin/firefox
Run Code Online (Sandbox Code Playgroud)
您可以只运行strace目标进程而不使用任何选项,但是这里的开关意味着跟踪子进程 ( -f) 并且跟踪所有打开的系统调用 ( -e trace=open) 如果要将输出保存到文件,您可以在指定-o ~/firefox.trace之前指定/usr/bin/firefox.
例如,如果您想要库调用的摘要列表,您可以使用
ltrace -c /usr/bin/leafpad
Run Code Online (Sandbox Code Playgroud)
然后退出程序并生成列表。省略-c实时查看呼叫的选项。
来自strace和的结果ltrace可能对您没有多大用处,因为除非您知道要查找的内容,否则它们很难破译,但lsof应提供一些基本的有用信息。