top命令在Linux中如何工作?如何给出实时输出?

时间:2019-02-27 07:15:40

标签: linux centos redhat

我正在探索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文件中获取数据并给出了产量。我的询问是照原样只提取了statuptimememinfoloadavg文件。关于流程信息以及它在哪里捕获以及如何显示流程信息的输出。您能给我更详细的信息吗?

1 个答案:

答案 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之类的伪文件,您最好快速打开,读取和关闭它们(实际上会发生这种情况)。在不到一毫秒的时间内)。另请参阅thisthat答案。

您在问:

  

top命令在Linux上如何工作?

顺便说一句, top命令是free software 。因此,请下载its源代码(以及libprocps的源代码),然后进行研究。我猜想top每秒都要扫描/proc/目录中的 (但这进展得如此之快,以至于您不太可能捕获该目录扫描,而您的lsof命令在实践中无法实现。

您可以使用strace(1)来捕获所有system calls(由top之类的命令完成),然后您会看到打开了/proc/1234/之类的目录,top如此迅速地扫描和关闭,以致lsof -c top看不到它们。