lsof
имеет формат вывода для "постобработки" с параметром -F
(см. Раздел ВЫХОД ДЛЯ ДРУГИХ ПРОГРАММ в руководстве ).
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
: по выходным полям. Спросите часть n . | sed
постпроцесс с sed
, чтобы выбрать только интересующую нас часть: \ | ^ n / |! d
: пропустить все, что не начинается с n /
s / type = ... $ /; t end
: удалить эти строки в конце строки и в случае успеха перейти к метке end
. : конец
: метка конец
. s | ^ n ||
: удалить начальный символ n
, который lsof
вставляет для идентификации выводимого поля. Однако обратите внимание, что непечатаемые символы в именах файлов кодируются (например, \ n
для новой строки, ^ [
для ESC ...) неоднозначным образом (как в ^ [
может означать либо ^ [
и ESC).
Кроме того, для удаленных файлов, по крайней мере, в Linux, вы все равно получите путь к файлу, но с добавлением (удалено)
. Опять же, нет способа отличить удаленный файл от файла, имя которого заканчивается на (удалено)
.Просмотр количества ссылок не обязательно поможет, поскольку удаленный файл может быть связан в другом месте.
См. Также удаление type = *
, которое мы делаем для сокетов домена Unix, которое могло действительно иметь место в имени файла.
Это означает, что, хотя это будет работать в большинстве случаев, вы не можете надежно постобработать этот вывод в общем случае.
Не говоря уже о том, что lsof
сам может не правильно проанализировать информацию, возвращаемую ядром, или что ядро может не предоставить эту информацию в надежно анализируемом формате