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 可以列出父进程和子进程的打开文件。第二列的输出是父进程