Пользовательский вывод lsof

Мне нужен список открытых файлов, портов и т. Д. Процессом. Теперь, когда я использую lsof -p <PID> я могу разобрать вывод в скрипте python, но проблема в том, что иногда я получаю несколько столбцов, которые пусты. Поэтому при анализе результатов я получаю плохие результаты.

Я знаю, что я могу вручную искать FD в / proc для каждого процесса, но это должно быть в стандарте POSIX. Итак, мой вопрос: есть ли вообще сделать lsof print только список открытых файлов и ничего больше?

Я думаю о чем-то вроде, например, конкретной команды ps ( ps -eopid,user,comm,command ), где мы можем указать, какие команды поступают в выход. В этом случае я хочу указать только столбцы «Имя» в lsof -p <PID> .

  • Преобразование аккордов TeX в UTF-8 в Python
  • как найти имя SMTP-сервера по умолчанию?
  • Почему mail-utils / cron отправляет так много писем?
  • Запуск сценария Python в виртуальной среде Conda в качестве службы
  • Как печатать одинаковые строки несколько раз с переменными, измененными с помощью Sed / Awk / anything?
  • сохранить вывод скрипта python в текстовый файл
  • Как установить библиотеку pylzma python в Linux?
  • не удается найти документацию по json.tool
  • One Solution collect form web for “Пользовательский вывод lsof”

    lsof имеет формат вывода после обработки с опцией -F (см. раздел OUTPUT FOR OTHER PROGRAMS в руководстве).

     lsof -nPMp "$pid" -Fn | sed ' \|^n/|!d s/ type=STREAM$//; t end s/ type=DGRAM$//; t end s/ type=SEQPACKET$// : end s|^n||' 

    Перечислит открытые файлы, которые разрешают путь к файловой системе.

    • -nPM отключает часть обработки, которую lsof делает по умолчанию, и которую мы здесь не заботимся, например, разрешаем IP-адреса, имена портов или rpc.
    • -p "$pid" , укажите процесс, чьи открытые файлы в список
    • -Fn : по выходу. Попросите его.
    • | sed | sed post process с sed чтобы выбрать только интересующую нас деталь:
    • \|^n/|!d : пропустить все, что не начинается с n/
    • s/ type=...$/;t end : удалите эти строки в конце строки и, если удастся, перейдите к end метке.
    • : end : end метка.
    • s|^n|| : удалить ведущий символ n который lsof вставляет, чтобы идентифицировать выводимое поле.

    Однако обратите внимание, что непечатаемые символы в именах файлов закодированы (например, \n для новой строки, ^[ для ESC …) неоднозначно (как в ^[ может означать либо ^[ и ESC]).

    Кроме того, для удаленных файлов по крайней мере на Linux вы все равно получите путь к файлу, но с добавлением (deleted) . Опять же, нет возможности различать удаленный файл и файл, чье имя заканчивается (deleted) . Глядя на счет ссылки, не обязательно поможет, поскольку удаленный файл может быть связан в другом месте.

    См. Также удаление type=* которое мы делаем для сокетов домена Unix, которые могли иметь место в имени файла.

    Это означает, что, хотя он будет работать в большинстве случаев, вы не можете постпроизвести этот вывод надежно в общем случае.

    Не говоря уже о том, что сам lsof может не правильно проанализировать информацию, возвращаемую ядром, или что ядро ​​может не предоставить эту информацию в lsof анализируемом формате

    Linux и Unix - лучшая ОС в мире.