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