lsof -p 12345 将列出 pid 为 12345 的进程打开的所有文件,但仅限于特定的时间。
我们如何从开始到结束(直到进程终止)持续监视进程以列出/显示进程在其整个生命周期中访问的每个文件?
我在 CentOS 7 上运行了 java(yeah java...) 应用程序。过了一会儿,有很多“已删除”的文件困扰着我。
对于使用的已删除文件(不是问题):
lsof | grep "(deleted)"
Run Code Online (Sandbox Code Playgroud)
我在 /proc/pid/fd/... 中找到了它们,我的问题是如何在不杀死进程的情况下杀死/删除它们(进程必须 24/7 运行)。
我在google上看到我可以使用gdb工具,但我不知道如何使用它。你能帮我吗(只是写一步一步的手册)?
如果您有其他建议,我很乐意听取。
我已经在 SX 和其他地方搜索过这里,但没有找到一种方法来解决我的问题。我在外部 Firewire 驱动器上有一个卷(由 Time Machine 使用)。连接驱动器后,它有 3 个卷。三分之二的弹出没有问题,但最后一个 (LaCie) 永远无法卸载,除非强制(例如$ umount -f LaCie)。我可以看到驱动器几乎连续被访问,但我不知道哪个进程正在执行此操作;和lsof帮助有限。大多数情况下它不会返回如下结果,但偶尔会报告 Finder 在卷上打开了一个目录。但我不明白为什么会出现问题,因为在卸载卷时 Finder 应该关闭所有打开的文件或目录。这个问题是在我升级到 Mountain Lion 后才出现的。我使用了一个克隆工具(SuperDuper!),但确保它没有运行;并且lsof似乎证实了这一点。我还能如何找出锁定音量的原因?每次我想断开驱动器的连接时,我都不热衷于强行弹出卷,因为我肯定会冒主备份磁盘上的数据丢失的风险。
~ $ sudo diskutil unmount /Volumes/LaCie/
Volume LaCie on disk1s1 failed to unmount
~ $ lsof | grep LaCie
~ $ lsof | grep /Volumes/LaCie
~ $
Run Code Online (Sandbox Code Playgroud) 我试图弄清楚为什么 Eclipse 会旋转,所以我决定启动 strace。
我使用以下方法找到了 eclipse 过程:
$ ps ax | grep java
5546 ? Sl 19:04 /usr/bin/java ... [arguments omitted]
Run Code Online (Sandbox Code Playgroud)
通过strace在这个进程上运行,我看到它正在等待另一个进程:
$ sudo strace -p 5546
Process 5546 attached - interrupt to quit
futex(0x7f6c416679d0, FUTEX_WAIT, 5547, NULL^C <unfinished ...>
Process 5546 detached
Run Code Online (Sandbox Code Playgroud)
有趣的是,进程 5547 没有出现在ps(谁能告诉我为什么?),但我可以strace。它反复吐出很多 EAGAIN 失败(偶尔成功)
read(16, 0x7f6c41664d10, 16) = -1 EAGAIN (Resource temporarily unavailable)
recvfrom(15, 0x7f6c3815f2e4, 4096, 0, 0, 0) = -1 EAGAIN (Resource temporarily unavailable)
clock_gettime(CLOCK_MONOTONIC, {67410, 357843264}) = 0 …Run Code Online (Sandbox Code Playgroud) 使用lsof,我可以找到所有带有 TCP 套接字侦听连接的进程:
lsof -Pni -sTCP:LISTEN
例如:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
cupsd 662 root 7u IPv6 11108 0t0 TCP [::1]:631 (LISTEN)
cupsd 662 root 8u IPv4 11109 0t0 TCP 127.0.0.1:631 (LISTEN)
rsyncd 905 root 4u IPv4 13379 0t0 TCP *:873 (LISTEN)
...
Run Code Online (Sandbox Code Playgroud)
有什么方法(不将输出管道传送到另一个程序,例如grep, awk, 或sed)来限制它监听通配符地址的 TCP 套接字?尝试:
$ lsof -Pni @0.0.0.0 -sTCP:LISTEN
lsof: incomplete Internet address specification: -i @0.0.0.0
Run Code Online (Sandbox Code Playgroud)
和
$ lsof -Pni @\* -sTCP:LISTEN
lsof: unknown host …Run Code Online (Sandbox Code Playgroud) 我知道进程打开的文件的文件描述符,但我不知道进程 ID。如果我知道进程打开的文件的文件描述符,如何从 Linux 命令提示符打印文件名?
“工作区”是一个加密的 dmg,我在其中保存代码。我通常不会卸载它,但我需要进行备份,但它拒绝让我卸载:
\n\nmark@mark-macbook-air /Volumes$ lsof | grep Workspace\nmark@mark-macbook-air /Volumes$ lsof Workspace\nmark@mark-macbook-air /Volumes$ hdiutil detach /Volumes/Workspace\nhdiutil: couldn\'t unmount "disk1" - Resource busy\nmark@mark-macbook-air /Volumes$ hdiutil unmount /Volumes/Workspace\nhdiutil: unmount: "/Volumes/Workspace" failed to unmount due to error 49168.\nhdiutil: unmount failed - Resource busy\nmark@mark-macbook-air /Volumes$ ls\nMacintosh HD@ Workspace/\nRun Code Online (Sandbox Code Playgroud)\n\n如果我尝试通过 Finder 卸载:
\n\n"The disk \xe2\x80\x9cWorkspace\xe2\x80\x9d couldn\xe2\x80\x99t be ejected because \xe2\x80\x9cTerminal\xe2\x80\x9d is using it.".\nRun Code Online (Sandbox Code Playgroud)\n\n我只打开了一个终端窗口。看来我可以关闭终端,但因为我很确定它没有使用它,所以我运行sudo lsof并看到了几个“mds”和一个“login”。MDS 是聚光灯的一部分,因此我在卷上禁用了聚光灯索引。这杀死了一些进程。我现在只剩下两个:
mark@mark-macbook-air /Volumes$ sudo lsof /Volumes/Workspace/\nCOMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME\nlogin …Run Code Online (Sandbox Code Playgroud) 我知道我可以lsof用来列出打开的文件,我知道我可以用来find在给定目录中通过 inode 查找文件。
但是如何有效地结合这两个程序来列出在给定目录中打开的所有打开文件?或者有没有更好的方法来回答这个问题?