В чем разница между `lsof -p <pid> | wc -l` и `ls / proc / <pid> / fd | wc -l`?

13

Справочная информация: я играю с мониторингом ulimit для запуска процессов для конкретного пользователя. (Я иногда видел процессы, которые начинались с неправильного лимита.) Я попросил пару самоотверженных Linux-гуру, и один предложил lsof -p <pid>, в то время как другой предложил ls /proc/<pid>/fd, но ни один из них не был положительным, что более точно отражает фактическое количество к максимальному лимит открытых файлов для процесса.

Итак, что это?

lsof -p <pid> | wc -l

Или

ls /proc/<pid>/fd | wc -l

Пожалуйста, уточните разницу. Благодарность!

Джаред
источник
3
Походит на домашнюю работу.
ewwhite
1
Не домашнее задание. Добавлено лучшее объяснение. Я прочитал lsofсправочные страницы, и, хотя я подозревал, что ответом являются файлы с отображением в памяти, я хотел получить подтверждение более опытного человека.
Джаред

Ответы:

10

lsofтакже предоставит вам отображенные в памяти .so-файлы - что технически не совпадает с дескриптором файла, над которым приложение имеет контроль. /proc/<pid>/fdявляется точкой измерения для дескрипторов открытого файла - однако: упоминается на странице proc-man - если основной поток многопоточной программы завершился, этот каталог будет недоступен.

lsof -p <pid> | grep -v mem | egrep -v '^COMMAND PID' | wc -lпокажет вам те же предметы, что и ls /proc/<pid>/fd | wc -l.

Карты памяти доступны в /proc/<pid>/maps.

Kvisle
источник
lsofДает почти тот же результат, но он также включает в себя cwd, rtdи txtдескрипторы файлов.
Ян Бэмфорт
Также обратите внимание, что количество пробелов между COMMANDи PIDможет варьироваться. Замените пробелы на, [[:space:]]*чтобы сделать его более общим.
Ян Бэмфорт
Я также нашел lsof -a -p <pid> -d ^mem -d ^cwd -d ^rtd -d ^txt -d ^DEL | wc -l здесь , в то время как lsofв оболочке Android ( adb shell) не поддерживает -aи -d. Так что, наконец, я использую версию Kvisle.
Выходные