我正在探索 top
命令的工作方式,并逐渐从服务器及其演示文稿中获取信息。以下是我的发现,您是否可以给予一些合理的重点以了解这一点。
以获取您的信息:
我在第一个会话中运行了top
命令,并在另一个会话中给出了lsof -c top
。它的产量下降
# lsof -c top
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
top 86597 root cwd DIR 253,0 4096 67149954 /root
top 86597 root rtd DIR 253,0 4096 128 /
top 86597 root txt REG 253,0 106944 10467 /usr/bin/top
top 86597 root mem REG 253,0 50744 33803265 /usr/lib64/libnuma.so.1
top 86597 root mem REG 253,0 106075056 33803109 /usr/lib/locale/locale-archive
top 86597 root mem REG 253,0 68192 33576550 /usr/lib64/libbz2.so.1.0.6
top 86597 root mem REG 253,0 90248 33588715 /usr/lib64/libz.so.1.2.7
top 86597 root mem REG 253,0 100008 33804478 /usr/lib64/libelf-0.172.so
top 86597 root mem REG 253,0 402384 33588705 /usr/lib64/libpcre.so.1.2.0
top 86597 root mem REG 253,0 19896 34975734 /usr/lib64/libattr.so.1.1.0
top 86597 root mem REG 253,0 141968 33804335 /usr/lib64/libpthread-2.17.so
top 86597 root mem REG 253,0 88776 33597070 /usr/lib64/libgcc_s-4.8.5-20150702.so.1
top 86597 root mem REG 253,0 330464 33807284 /usr/lib64/libdw-0.172.so
top 86597 root mem REG 253,0 105824 33804337 /usr/lib64/libresolv-2.17.so
top 86597 root mem REG 253,0 19384 33576919 /usr/lib64/libgpg-error.so.0.10.0
top 86597 root mem REG 253,0 535064 33576927 /usr/lib64/libgcrypt.so.11.8.2
top 86597 root mem REG 253,0 85952 33906471 /usr/lib64/liblz4.so.1.7.5
top 86597 root mem REG 253,0 157400 33588725 /usr/lib64/liblzma.so.5.2.2
top 86597 root mem REG 253,0 155784 33804371 /usr/lib64/libselinux.so.1
top 86597 root mem REG 253,0 43776 33804347 /usr/lib64/librt-2.17.so
top 86597 root mem REG 253,0 1137016 33804038 /usr/lib64/libm-2.17.so
top 86597 root mem REG 253,0 20032 33577001 /usr/lib64/libcap.so.2.22
top 86597 root mem REG 253,0 2151672 33803924 /usr/lib64/libc-2.17.so
top 86597 root mem REG 253,0 19288 33804036 /usr/lib64/libdl-2.17.so
top 86597 root mem REG 253,0 174576 33990961 /usr/lib64/libtinfo.so.5.9
top 86597 root mem REG 253,0 163704 33990950 /usr/lib64/libncurses.so.5.9
top 86597 root mem REG 253,0 203800 33598907 /usr/lib64/libsystemd.so.0.6.0
top 86597 root mem REG 253,0 78840 33577018 /usr/lib64/libprocps.so.4.0.0
top 86597 root mem REG 253,0 163400 33803344 /usr/lib64/ld-2.17.so
top 86597 root mem REG 253,2 217032 50448935 /var/db/nscd/passwd
top 86597 root 0u CHR 136,1 0t0 4 /dev/pts/1
top 86597 root 1u CHR 136,1 0t0 4 /dev/pts/1
top 86597 root 2w CHR 1,3 0t0 1040 /dev/null
top 86597 root 3u CHR 136,1 0t0 4 /dev/pts/1
top 86597 root 4r REG 0,3 0 4026532029 /proc/stat
top 86597 root 5r REG 0,3 0 4026532030 /proc/uptime
top 86597 root 6r REG 0,3 0 4026532028 /proc/meminfo
top 86597 root 7r REG 0,3 0 4026532027 /proc/loadavg
沿着这些行,当我们输入顶部命令时,它将冒险到这些LIB记录,最后从/proc
文件中获取数据并给出了收率。我的询问仅按照stat
,uptime
,meminfo
和loadavg
文件进行。该过程信息及其捕获的位置以及如何显示流程信息的输出何处。您能给我提供有关此的更多详细信息吗?
顶部(1)和PS(1) - 许多其他命令正在使用/proc/
(通过libprocfs
库)。阅读Proc(5)。在Linux上,/proc/
是查询Linux内核有关其整个系统状态的通常方法。
/proc/
文件系统(称为procfs)是"虚拟",因为Linux内核是 lazily 计算其内容而无需从磁盘中获取任何数据的意义。每个过程都有/proc/
的目录描述。因此,/proc/1234/
描述了PID 1234的过程。
您可以通过直接读取/proc/
目录(使用OpenDir(3)readdir(3)闭合(3)cloteir(3)stat(2)目录及其条目来模仿ps
的作用(2)2)用于文件等...)
在实践中,对于诸如/proc/vmstat
,/proc/meminfo
或/proc/1234/maps
之类的伪文件,您最好快速打开,阅读和关闭它们(实际上,这可能会在不到一毫秒的时间内发生)。另请参阅此问题。
您在问:
top
命令如何在Linux上工作?
btw, top
命令是免费软件。因此,请下载其源代码(以及libprocps
的源代码),然后对其进行研究。我猜top
正在扫描每秒 /proc/
目录(但这是如此之快,以至于您不太可能捕获该目录扫描,您的lsof
命令在实践中不会捕获)。
您可以使用Strace(1)捕获所有系统调用(由top
等命令完成),然后您会看到诸如/proc/1234/
之类的目录被打开,扫描并通过top
快速关闭,以至于lsof -c top
DON DON DON'看他们。