2

当我运行时pgrep vim | xargs echo,它会打印93868 91234

当我运行时lsof -p 91234,它会打印:

COMMAND   PID USER   FD   TYPE DEVICE  SIZE/OFF    NODE NAME
vim     91234 rose  cwd    DIR    1,2      1326 1186863 /Users/rose/spotapi/spotapi/models
vim     91234 rose  txt    REG    1,2   1629296   12231 /usr/bin/vim
vim     91234 rose  txt    REG    1,2   2704416  294199 /System/Library/Frameworks/Python.framework/Versions/2.7/Python

那为什么

pgrep vim | xargs lsof -p 

打印

lsof: status error on 91234: No such file or directory

我在 Mac OS 上运行。

4

2 回答 2

5

我在我的 Slackware 安装中看到了这一点。如果你运行lsof -p 93868 91234,你会看到问题。原因是xargs如果可以的话,将所有参数推到一个命令行上。您可以使用该-n选项来指定参数的最大数量。

pgrep vim | xargs -n1 lsof -p
于 2013-09-15T22:12:15.923 回答
0

或者,您可以通过用逗号替换空格来提供多个 PID:

lsof -p `pgrep vim | xargs echo | sed -re 's/ /,/g'`

在上面的示例中,我使用 xargs 将所有 pid 传递给 echo 作为将它们放入单行的一种方式,然后用逗号替换空格。针对 lsof 执行的命令是:

lsof -p 1111,2222

一种更简单的方法(如果您知道进程名称,例如 vim)并且不需要 pgrep:

lsof -p `pidof vim | sed -re 's/ /,/g'`

不是 100% 确定它在 osx 中的兼容性和可用性,这是一个 Fedora / Ubuntu。

于 2014-09-30T11:13:21.110 回答