2013-09-15 1 views
1

Когда я запустил pgrep vim | xargs echo, он печатает 93868 91234.xargs не работает с lsof

Когда я бегу 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

не может реплицировать эту ошибку на Linux, возможно, это [эта проблема] (http://stackoverflow.com/questions/12468629/lsof-should-give-all-open-files-for-a-set-of- ИДП)? или делает [lsof -c] (http://stackoverflow.com/a/12468802/2399627) помощь? –

ответ

3

Я вижу это на моей установке Slackware. Если вы запустите lsof -p 93868 91234, вы увидите проблему. Причина в том, что xargs переводит все аргументы в одну командную строку, если это возможно. Вы можете использовать опцию -n, чтобы указать максимальное количество аргументов.

pgrep vim | xargs -n1 lsof -p 
0

В качестве альтернативы, вы можете указать несколько ИДП, заменяя пробелы запятыми:

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

В приведенном выше примере, я использую xargs передать все ПИДы эхо как способ получить их в единый line, а затем замените пробелы запятыми. Выполненная команда против LSOF является:

lsof -p 1111,2222 

Простой способ сделать это (если вы знаете имя процесса, например, ВИМ) и не нуждаются в pgrep:

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

не на 100% уверен совместимость и доступность этого в osx, это была Fedora/Ubuntu.