Lsof должен предоставить все открытые файлы для набора pids

У меня есть 30 экземпляров процесса, выполняющегося на сервере, и вы хотите регистрировать открытые файлы для каждого процесса для анализа.

Я выполнил следующую команду:

* ps auwwx | grep PROG_NAME | awk '{print $2}' | xargs lsof -p | less

Он жалуется, что "lsof: ошибка состояния: нет такого файла или каталога"

Однако, если я запустил lsof -p < pid >, он дает мне список открытых файлов для этого процесса. Как я могу получить список всех открытых файлов для всех 30 экземпляров процесса на машине FreeBSD.

Кроме того, я не хочу, чтобы разделяемые библиотеки были перечислены. Если я делаю -d "^txt", он не отображает некоторые другие файлы db, которые я хочу показать. Есть ли другой способ сгладить файлы .so?

Ответ 1

Параметр lsof -p принимает список идентификаторов PID, разделенных запятыми. То, как вы используете xargs, передаст pids как отдельные аргументы, ведущие к интерпретации имен файлов.

Попробуйте lsof -p $(your grep | tr '\012' ,) Что будет иметь конечную запятую, я не уверен, что если lsof будет заботиться, но вы можете sed отключить его при необходимости.

Ответ 2

Вы можете использовать xargs -L1 lsof -p для запуска lsof один раз за pid.

Еще лучше: используйте lsof -c, чтобы перечислить все открытые файлы из команд, соответствующих определенному шаблону:

lsof -c bas # list all processes with commands starting with 'bas'
lsof -c '/ash$/x' # list all commands ending with 'ash' (regexp syntax)