it-swarm-ru.tech

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

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

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

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

21
LanceBaynes

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

21
enzotib

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

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

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

15
Gilles 'SO- stop being evil'

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

например:

pfiles /proc/*

8
jlliagre

Моя версия, с чуть меньшим количеством утилит:

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

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

2
Bryce Schober

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

  • у вас нет разрешения на просмотр, или
  • для файлов, которые содержат строку "Отказано в доступе"
( 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
0
Parthian Shot