it-swarm.cn

“ lsof”命令的替代方案?

在许多情况下,我必须使用的机器上未安装“ lsof”,但是非常需要lsof的“功能”(例如,在AIX上)。 :\

非Windows世界中是否有类似“ lsof”的应用程序?

更新:例如:我需要知道哪些进程使用“/home/username”目录?

21
LanceBaynes

我知道 fuser ,看看您的系统上是否可用。

21
enzotib

nix Rosetta Stone 是解决此类问题的好资源。它提到了 lsof 的一些替代方法(请参见下文)。但是请注意,lsof实际上是其功能的标准应用程序。

如果您只想查找打开了特定文件的进程ID,则可以在任何POSIX兼容系统上使用 fuser

在具有/proc目录的操作系统上,您可以通过/proc中的信息查询某个进程打开的文件(与lsof的最常见操作模式相反)。某些操作系统具有用于以下目的的命令:

15

如果您恰好运行Solaris,则lsofpfiles的替代方法,它默认情况下未安装,可能会在ZFS上阻塞。

例如:

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