我正在探索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
沿着这些行,当我们输入top命令时,它正在冒险访问这些lib记录,最后从/proc
文件中获取数据并给出了产量。我的询问是照原样只提取了stat
,uptime
,meminfo
和loadavg
文件。关于流程信息以及它在哪里捕获以及如何显示流程信息的输出。您能给我更详细的信息吗?
答案 0 :(得分:0)
top(1)和ps(1)-以及许多其他命令正在使用/proc/
(通过libprocfs
库)。阅读proc(5)。在Linux上,/proc/
是查询Linux kernel整个系统状态的常用方法。
/proc/
file-system(称为procfs)是“虚拟的”,从某种意义上说Linux内核懒惰地计算其内容而不获取任何数据从磁盘。每个进程在/proc/
下都有一个描述它的目录。因此/proc/1234/
描述了pid 1234的过程。
您可以通过直接读取ps
目录来模仿/proc/
的作用(使用opendir(3) readdir(3) closedir(3) stat(2)来查找目录及其条目,以及open(2) read(2) close(2)用于文件等...)
实际上,对于/proc/vmstat
,/proc/meminfo
或/proc/1234/maps
之类的伪文件,您最好快速打开,读取和关闭它们(实际上会发生这种情况)。在不到一毫秒的时间内)。另请参阅this和that答案。
您在问:
top
命令在Linux上如何工作?
顺便说一句, top
命令是free software 。因此,请下载its源代码(以及libprocps
的源代码),然后进行研究。我猜想top
每秒都要扫描/proc/
目录中的 (但这进展得如此之快,以至于您不太可能捕获该目录扫描,而您的lsof
命令在实践中无法实现。
您可以使用strace(1)来捕获所有system calls(由top
之类的命令完成),然后您会看到打开了/proc/1234/
之类的目录,top
如此迅速地扫描和关闭,以致lsof -c top
看不到它们。