xargs没有使用lsof

时间:2013-09-15 21:52:26

标签: macos xargs lsof

当我运行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上运行。

2 个答案:

答案 0 :(得分:3)

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

pgrep vim | xargs -n1 lsof -p

答案 1 :(得分: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'`

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