Альтернативы для команды «lsof»?

20

Во многих случаях «lsof» не установлен на машинах, с которыми мне приходится работать, но «функция» lsof будет очень нужна (например, в AIX). : \

Есть ли какие-либо "lsof" подобные приложения в мире не-windows?

ОБНОВЛЕНИЕ: например: мне нужно знать, какие процессы используют каталог "/ home / username"?

LanceBaynes
источник
1
Не могли бы вы быть более конкретным, пожалуйста? Какие системы кроме AIX (которые определенно поддерживается lsof) вы имеете в виду? Или вы имеете в виду только один конкретный тип использования? Вообще: почему не lsof?
rozcietrzewiacz
Я использую Linux 2.6.18-92.el5 GNU, и у меня нет lsof, и при этом у меня нет возможности использовать lsof :(
SSH This
Связанный вопрос: как проверить открытый файл без lsof
Stéphane Gourichon

Ответы:

20

Я знаю fuser, посмотреть, если есть в вашей системе.

enzotib
источник
Что я должен дать fuser в качестве параметра для списка всех открытых файлов в системе? : О ты!
LanceBaynes
2
Команда sudo fuser -vm / 2>&1 | awk '$3 ~ /f|F/' | lessможет показать все процессы, имеющие открытые файлы в смонтированной файловой системе /. Смотрите справочную страницу для конкретной помощи.
энзотиб
TY! это дает вывод, как это: pastebin.com/raw.php?i=2z19g6Rk - я гуглил это, но я не могу найти какой-либо способ вывести напр .: "gnome-screensaver", а не "gnome-Screenav" - так как я могу вывести его с широкими именами команд? : O
LanceBaynes
он выдает тот же результат для: pastebin.com/raw.php?i=Fe3EJvUv
LanceBaynes,
Как то так:sudo fuser -vm / 2>&1 | awk '$3 ~ /f|F/' | while read user pid flags rest; do printf '%10s %10s %10s %s\n' $user $pid $flags "$(</proc/$pid/cmdline)"; done | less
enzotib
15

Unix Rosetta Stone является хорошим ресурсом для такого рода вопросов. Он упоминает несколько альтернатив для lsof (см. Ниже). Однако обратите внимание, что lsof является де-факто стандартным приложением для своей деятельности.

Если все, что вам нужно, это найти идентификаторы процессов, в которых открыт определенный файл, то вы можете использовать их fuserв любой POSIX-совместимой системе.

В операционных системах с /procкаталогом вы можете запрашивать файлы, открытые процессом (в отличие от lsofнаиболее распространенного режима работы), через информацию в /proc. Некоторые операционные системы имеют команды для этого:

Жиль "ТАК - прекрати быть злым"
источник
8

Если вы используете Solaris, альтернатива lsof, которая не установлена ​​по умолчанию и может подавиться ZFS, является pfiles.

например:

pfiles /proc/*

jlliagre
источник
2

Моя версия, с чуть меньшим количеством запущенных утилит:

for proc_pid in $(find /proc -maxdepth 1 -name "[0-9]*"); do \
    ls -l ${proc_pid}/fd 2>/dev/null \
    | grep -q "$search_term" \
    && echo "${proc_pid#/proc/}"; \
done

По общему признанию, это может не обработать все угловые случаи, но работает в моем случае использования.

Брайс Шобер
источник
0

Это должно сделать свое дело. Это даст все сопоставления дескриптора файла, кроме тех, которые:

  • у вас нет разрешения на просмотр, или
  • для файлов, которые содержат строку «Отказано в доступе»
( find /proc -mindepth 1 -maxdepth 1 \
  | grep -E [0-9]+ | xargs -n 1 -I% find %/fd \
  | xargs ls -l \
  | grep -v "Permission denied" ) 2>/dev/null \
| cut -d' ' -f12- | less

Если вы уже знаете, что заботитесь только о сопоставлениях для определенных программ, вы можете вместо этого использовать что-то более похожее на:

exec=sshd
pgrep "$exec" | xargs -n 1 ps -p
pgrep "$exec" | xargs -n 1 -I% find /proc/%/fd | xargs ls -l | cut -d' ' -f12- | less
Парфянский выстрел
источник
-2

Иногда lsofустанавливается в/usr/sbin

Если /usr/sbinэто не ваша часть $PATH, вы можете пропустить команду, даже если она установлена.

Проверьте это с

whereis lsof
lsof: /usr/sbin/lsof /usr/share/man/man8/lsof.8.gz
милостивый
источник
ОП сказал, что lsof не был установлен, и попросил альтернативы ...
Джефф Шаллер