如何使用 lsof 列出父进程及其子进程打开的所有文件?

如何使用 lsof 列出父进程及其子进程打开的所有文件?
lsof -p PID

可以很好地列出单个进程打开的所有文件,但我需要列出特定主进程及其子进程当前打开的所有文件。做这个的最好方式是什么?如果这不可能lsof,我还能用什么其他方法来实现这一点?

答案1

对于 及其$pid(直接)孩子,您可以这样做:

lsof -p "$({ echo "$pid"; pgrep -P "$pid"; } | paste -sd , -)"

pgrep, likelsof不是一个标准命令,但现在在很多系统上都可以找到。

对于所有后代(子代、孙子等),您可以用来pstree获取 pid 列表,但这并不是万无一失的,因为它的输出无法可靠地解析。您可以使用辅助函数,例如:

descendants() {
  ps -Ao pid= -o ppid= | PID=$1 perl -lae '
    push @{$children{$F[1]}}, $F[0];
    sub tree {
      my @pids=($_[0]);
      push @pids, tree($_) for @{$children{$_[0]}};
      return @pids;
    }
    END{print for tree $ENV{PID}}'
}

然后调用:

lsof -p "$(descendants "$pid" | paste -sd, -)"

答案2

半手工时装:

$ pstree -p PID

从上面收集 PID

$ lsof -p pid1,pid2,pid3,...

或者,循环遍历 的输出ps --ppid 1413 -o pid=直到其为空,以收集 pid 列表。

答案3

lsof -n | awk '{print $2}' | sort | uniq -c | sort -nr | grep PARENT_PID

因为 lsof 可以列出父进程和子进程的打开文件。第二列的输出是父进程

相关内容