我如何知道程序尝试访问哪个文件?

我有一个程序,我试图运行,但是当我运行它; 它只是抱怨它找不到特定的文件。

但是我不知道它试图找到这个特定文件的文件夹。我有一个所需文件的副本,我只需要知道要复制哪个文件夹。

有没有办法实时显示正在访问哪些文件或哪些文件正在尝试和无法访问?

如果有帮助,我正在使用Ext4文件系统。

谢谢

(我首先在这个askubuntu问题上发布了我的答案,但是将其从那里删除并在此处发布,因为它更相关。)

有几种方法可以调查哪些文件和库进程已打开; 主要工具是lsofstraceltrace 。 有时使用sudo运行它们是必要的,因此程序可以访问所需的一切,以获得程序调用的准确快照。

1)使用lsof您需要查找要查询的进程ID,因此请使用,例如:

 lsof -c firefox 

这将列出firefox打开的所有文件及其对系统共享库的所有调用。 (Firefox目前在我的系统上有一个3310的pid,所以你也可以使用lsof -p 3310 ,但你必须首先用ps aux | grep [f]irefox查找进程id)。 有关lsof更多信息在这篇有用的IBM文章中有详细介绍 。

2) ltracestrace具有非常相似的function和选项,对于查找有关进程调用的详细信息非常有用。 主要区别在于ltrace通常只跟踪library调用(虽然它可以使用-S选项跟踪系统调用),而strace跟踪library和其他system调用。 有关跟踪过程的更多信息,请参阅此IBM文章 。 如果你想检查一个已经运行的进程, strace对你来说可能更有用,但是当给定一个进程pid时, strace也可以实时监控这些调用(当一个进程连接时总是使用sudo):

 sudo strace -p 3310 

但是使用strace启动程序并查看所调用的内容会更有用,如下例所示:

 strace -f -e trace=open /usr/bin/firefox 

您可以使用目标进程运行strace而没有选项,但这里的开关意味着跟踪子进程( -f )并跟踪所有打开的系统调用( -e trace=open )如果要将输出保存到在指定/usr/bin/firefox之前,您可以指定-o ~/firefox.trace文件。

例如,如果需要库调用的摘要列表,则可以使用

 ltrace -c /usr/bin/leafpad 

然后退出程序,将生成列表。 省略-c选项以实时查看调用。

straceltrace的结果可能对你没什么用,因为除非你知道你在寻找什么,否则它们很难破译,但lsof应该提供一些基本的有用信息。

最简单的方法是通过strace运行程序并观察stat64()调用(获取文件信息)或打开文件的open()调用。

所以你也是:

 strace -e stat64 -e open [program name] 

在结果输出中查找:

(没有相应的文件和目录)

它试图打开的路径应该在此错误的左侧。