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)