16.3.1 【Linux】程序的观察

简介: 16.3.1 【Linux】程序的观察

既然程序这么重要,那么我们如何查阅系统上面正在运行当中的程序呢?利用静态的 ps 或者是动态的 top,还能以 pstree 来查阅程序树之间的关系。

ps :将某个时间点的程序运行情况撷取下来

仅观察自己的 bash 相关程序: ps -l

系统整体的程序运行是非常多的,但如果使用 ps -l 则仅列出与你的操作环境 (bash) 有关的程序而已, 亦即最上层的父程序会是你自己的 bash 而没有延伸到 systemd (后续会交待!) 这支程序去!那么 ps -l 出来的数据有哪些呢? 我们就来观察看看:


F:代表这个程序旗标 (process flags),说明这个程序的总结权限,常见号码有:


若为 4 表示此程序的权限为 root ;


若为 1 则表示此子程序仅进行复制(fork)而没有实际执行(exec)。


S:代表这个程序的状态 (STAT),主要的状态有:


R (Running):该程序正在运行中;


S (Sleep):该程序目前正在睡眠状态(idle),但可以被唤醒(signal)。


D :不可被唤醒的睡眠状态,通常这支程序可能在等待 I/O 的情况(ex>打印)


T :停止状态(stop),可能是在工作控制(背景暂停)或除错 (traced) 状态;


Z (Zombie):僵尸状态,程序已经终止但却无法被移除至内存外。


UID/PID/PPID:代表“此程序被该 UID 所拥有/程序的 PID 号码/此程序的父程序 PID 号码”


C:代表 CPU 使用率,单位为百分比;


PRI/NI:Priority/Nice 的缩写,代表此程序被 CPU 所执行的优先顺序,数值越小代表该程序越快被 CPU 执行。


ADDR/SZ/WCHAN:都与内存有关,ADDR 是 kernel function,指出该程序在内存的哪个部分,如果是个 running 的程序,一般就会显示“ - ” / SZ 代表此程序用掉多少内存 /WCHAN 表示目前程序是否运行中,同样的, 若为 - 表示正在运行中。


TTY:登陆者的终端机位置,若为远端登陆则使用动态终端接口 (pts/n);


TIME:使用掉的 CPU 时间,注意,是此程序实际花费 CPU 运行的时间,而不是系统时间;


CMD:就是 command 的缩写,造成此程序的触发程序之指令为何。


所以你看到的 ps -l 输出讯息中,他说明的是:“bash 的程序属于 UID 为 0 的使用者,状态为睡眠 (sleep), 之所以为睡眠因为他触发了 ps (状态为 run) 之故。此程序的 PID 为14836,优先执行顺序为 80 , 下达 bash 所取得的终端接口为 pts/0 ,运行状态为等待(wait) 。


观察系统所有程序: ps aux


你会发现 ps -l 与 ps aux 显示的项目并不相同!在 ps aux 显示的项目中,各字段的意义为:


USER:该 process 属于那个使用者帐号的?


PID :该 process 的程序识别码。


%CPU:该 process 使用掉的 CPU 资源百分比;


%MEM:该 process 所占用的实体内存百分比;


VSZ :该 process 使用掉的虚拟内存量 (KBytes)


RSS :该 process 占用的固定的内存量 (KBytes)


TTY :该 process 是在那个终端机上面运行,若与终端机无关则显示 ?,另外, tty1-tty6是本机上面的登陆者程序,若为 pts/0 等等的,则表示为由网络连接进主机的程序。


STAT:该程序目前的状态,状态显示与 ps -l 的 S 旗标相同 (R/S/T/Z)


START:该 process 被触发启动的时间;


TIME :该 process 实际使用 CPU 运行的时间。


COMMAND:该程序的实际指令为何?


一般来说,ps aux 会依照 PID 的顺序来排序显示,我们还是以 14836 那个 PID 那行来说明!该行的意义为“ root 执行的 bash PID 为 14836,占用了 0.1% 的内存容量百分比,状态为休眠 (S),该程序启动的时间为 8 月 4 号,因此启动太久了, 所以没有列出实际的时间点。且取得的终端机环境为 pts/0 。”与 ps aux 看到的其实是同一个程序。

通过 sshd 提供的网络服务取得一个程序, 该程序提供 bash 给我使用,而我通过 bash 再去执行 ps axjf 。

top:动态观察程序的变化

相对于 ps 是撷取一个时间点的程序状态, top 则可以持续侦测程序运行的状态!使用方式如下:


top的功能非常多,可以参考man top的内部说明文档。


top是个挺不错的程序观察工具。不同于 ps 是静态的结果输出, top 这个程序可以持续的监测整个系统的程序工作状态。 在默认的情况下,每次更新程序资源的时间为 5 秒,不过,可以使用 -d 来进行修改。 top 主要分为两个画面,上面的画面为整个系统的资源使用状态,基本上总共有六行,显示的内容依序是:


第一行(top...):这一行显示的信息分别为:


目前的时间,亦即是 00:53:59 那个项目;


开机到目前为止所经过的时间,亦即是 up 6:07, 那个项目;


已经登陆系统的使用者人数,亦即是 3 users, 项目;


系统在 1, 5, 15 分钟的平均工作负载。代表的是 1, 5, 15 分钟,系统平均要负责运行几个程序(工作)的意思。 越小代表系统越闲置,若高于 1 得要注意你的系统程序是否太过繁复了!


第二行(Tasks...):显示的是目前程序的总量与个别程序在什么状态(running,sleeping, stopped, zombie)。


第三行(%Cpus...):显示的是 CPU 的整体负载,每个项目可使用 ? 查阅。需要特别注意的是 wa 项目,那个项目代表的是 I/O wait, 通常你的系统会变慢都是 I/O 产生的问题比较大!因此这里得要注意这个项目耗用 CPU 的资源喔! 另外,如果是多核心的设备,可以按下数字键“1”来切换成不同 CPU 的负载率。


第四行与第五行:表示目前的实体内存与虚拟内存 (Mem/Swap) 的使用情况。 再次重申,要注意的是 swap 的使用量要尽量的少!如果 swap 被用的很大量,表示系统的实体内存实在不足!


第六行:这个是当在 top 程序当中输入指令时,显示状态的地方。


至于 top 下半部分的画面,则是每个 process 使用的资源情况。比较需要注意的是:


PID :每个 process 的 ID 啦!


USER:该 process 所属的使用者;


PR :Priority 的简写,程序的优先执行顺序,越小越早被执行;


NI :Nice 的简写,与 Priority 有关,也是越小越早被执行;


%CPU:CPU 的使用率;


%MEM:内存的使用率;


TIME+:CPU 使用时间的累加;


top 默认使用 CPU 使用率 (%CPU) 作为排序的重点,如果你想要使用内存使用率排序,则可以按下“M”, 若要回复则按下“P”即可。如果想要离开 top 则按下“ q ”吧!如果你想要将 top的结果输出成为文件时, 可以这样做:


可以帮助你将某个时段 top 观察到的结果存成文件,可以用在你想要在系统背景下面执行。 由于是背景下面执行,与终端机的屏幕大小无关,因此可以得到全部的程序画面。

pstree


如果找程序之间的相关性,这个pstree很好用。直接输入 pstree 可以查到程序相关性,一般链接符号可以使用 ASCII码即可,但有时因为语系问题会主动的以 Unicode 的符号来链接, 但因为可能终端机无法支持该编码,或许会造成乱码问题。因此可以加上 -A 选项来克服此类线段乱码问题。


由 pstree 的输出我们也可以很清楚的知道,所有的程序都是依附在 systemd 这支程序下面的。


相关文章
|
6月前
|
安全 Linux Shell
Linux上执行内存中的脚本和程序
【9月更文挑战第3天】在 Linux 系统中,可以通过多种方式执行内存中的脚本和程序:一是使用 `eval` 命令直接执行内存中的脚本内容;二是利用管道将脚本内容传递给 `bash` 解释器执行;三是将编译好的程序复制到 `/dev/shm` 并执行。这些方法虽便捷,但也需谨慎操作以避免安全风险。
278 6
|
7月前
|
网络协议 Linux
Linux查看端口监听情况,以及Linux查看某个端口对应的进程号和程序
Linux查看端口监听情况,以及Linux查看某个端口对应的进程号和程序
806 2
|
7月前
|
Linux Python
linux上根据运行程序的进程号,查看程序所在的绝对路径。linux查看进程启动的时间
linux上根据运行程序的进程号,查看程序所在的绝对路径。linux查看进程启动的时间
117 2
|
5月前
|
运维 Java Linux
【运维基础知识】Linux服务器下手写启停Java程序脚本start.sh stop.sh及详细说明
### 启动Java程序脚本 `start.sh` 此脚本用于启动一个Java程序,设置JVM字符集为GBK,最大堆内存为3000M,并将程序的日志输出到`output.log`文件中,同时在后台运行。 ### 停止Java程序脚本 `stop.sh` 此脚本用于停止指定名称的服务(如`QuoteServer`),通过查找并终止该服务的Java进程,输出操作结果以确认是否成功。
203 1
|
6月前
|
消息中间件 分布式计算 Java
Linux环境下 java程序提交spark任务到Yarn报错
Linux环境下 java程序提交spark任务到Yarn报错
74 5
|
7月前
|
NoSQL Linux C语言
嵌入式GDB调试Linux C程序或交叉编译(开发板)
【8月更文挑战第24天】本文档介绍了如何在嵌入式环境下使用GDB调试Linux C程序及进行交叉编译。调试步骤包括:编译程序时加入`-g`选项以生成调试信息;启动GDB并加载程序;设置断点;运行程序至断点;单步执行代码;查看变量值;继续执行或退出GDB。对于交叉编译,需安装对应架构的交叉编译工具链,配置编译环境,使用工具链编译程序,并将程序传输到开发板进行调试。过程中可能遇到工具链不匹配等问题,需针对性解决。
273 3
|
7月前
|
网络协议 Linux Shell
在Linux中,如何通过一个端口找到程序?
在Linux中,如何通过一个端口找到程序?
|
7月前
|
Linux API
在Linux中,程序产生了库日志虽然删除了,但磁盘空间未更新是什么原因?
在Linux中,程序产生了库日志虽然删除了,但磁盘空间未更新是什么原因?
|
8月前
|
Java Linux Shell
Linux后台运行jar程序
【7月更文挑战第23天】
151 1
|
7月前
|
Linux Windows Python
最新 Windows\Linux 后台运行程序注解
本文介绍了在Windows和Linux系统后台运行程序的方法,包括Linux系统中使用nohup命令和ps命令查看进程,以及Windows系统中通过编写bat文件和使用PowerShell启动隐藏窗口的程序,确保即使退出命令行界面程序也继续在后台运行。