《Linux应用进程控制(一) — 进程以及相关监控命令》
1.进程的概念
UNIX标准进程的定义为:“一个其中运行着一个或多个线程的地址空间和这些线程所需要的系统资源”。说白了,进程基本就是看成是我们运行的一个程序。
2.进程的监控方法
2.1 ps命令
ps命令用于显示当前进程 (process) 的状态。
-e: 选择所有进程 -f: 全格式的列表 -a:选择除session leader 以外的进程和与该终端不相关的所有进程 -u:显示面向用户的格式 -x:列出所有进程
常用的命令就是ps -ef和ps -aux。
UID: 说明该程序被谁拥有 PID:就是指该程序的 ID PPID: 就是指该程序父级程序的 ID C: 指的是 CPU 使用的百分比 STIME: 程序的启动时间 TTY: 指的是登录终端 TIME : 指程序使用掉 CPU 的时间 CMD: 下达的指令
USER: 行程拥有者 PID: pid %CPU: 占用的 CPU 使用率 %MEM: 占用的内存使用率 VSZ: 占用的虚拟记忆体大小 RSS: 占用的内存大小 TTY: 终端的次要装置号码 (minor device number of tty) START: 行程开始时间 TIME: 执行的时间 COMMAND:所执行的指令 STAT: 该行程的状态,linux的进程有5种状态: D 不可中断 uninterruptible sleep (usually IO) R 运行 runnable (on run queue) S 中断 sleeping T 停止 traced or stopped Z 僵死 a defunct (”zombie”) process 注: 其它状态还包括W(无驻留页), <(高优先级进程), N(低优先级进程), L(内存锁页).
2.2 pstree命令
pstree命令将所有行程以树状图显示,树状图将会以 pid (如果有指定) 或是以 init 这个基本行程为根 (root),如果有指定使用者 id,则树状图会只显示该使用者所拥有的行程。
其中systemd其实就是init进程。
以树状图显示PID为进程以及子孙进程,如果有-p参数同时显示每个进程的PID。
可以通过pstree -p 1来指定要显示的进程以及其子孙进程(PID为1就是init进程)
2.3 top命令
top命令用于实时显示 process 的动态。
说明:
统计信息区:
前五行是当前系统情况整体的统计信息区。下面我们看每一行信息的具体意义。
第一行,任务队列信息,同 uptime 命令的执行结果,具体参数说明情况如下:
19:54:32 — 当前系统时间
up 18:23 — 系统已经运行了18小时23分钟(在这期间系统没有重启过)
1 users — 当前有1个用户登录系统
load average: 0.00, 0.01, 0.00 — load average后面的三个数分别是1分钟、5分钟、15分钟的负载情况。
load average数据是每隔5秒钟检查一次活跃的进程数,然后按特定算法计算出的数值。如果这个数除以逻辑CPU的数量,结果高于5的时候就表明系统在超负荷运转了
第二行,Tasks — 任务(进程),具体信息说明如下:
系统现在共有249个进程,其中处于运行中的有1个,170个在休眠(sleep),stoped状态的有0个,zombie状态(僵尸)的有0个。
第三行,cpu状态信息,具体属性说明如下:
0.1%us — 用户空间占用CPU的百分比。
0.2% sy — 内核空间占用CPU的百分比。
0.0% ni — 改变过优先级的进程占用CPU的百分比
99.7% id — 空闲CPU百分比
0.0% wa — IO等待占用CPU的百分比
0.0% hi — 硬中断(Hardware IRQ)占用CPU的百分比
0.0% si — 软中断(Software Interrupts)占用CPU的百分比
备注:在这里CPU的使用比率和windows概念不同,需要理解linux系统用户空间和内核空间的相关知识!
第四行,内存状态,具体信息如下:
2017564k total — 物理内存总量
97896k free — 空闲内存总量
762220k used — 使用中的内存总量
1057448k buffers — 缓存的内存量
第五行,swap交换分区信息,具体信息说明如下:
998396k total — 交换区总量
985840k free — 空闲交换区总量
12556k used — 使用的交换区总量
1004348k avail mem — 总的可利用内存
(Linux内存管理:https://segmentfault.com/a/1190000008125006)
第六行,空行。
第七行以下:各进程(任务)的状态监控,项目列信息说明如下:
PID — 进程id
USER — 进程所有者
PR — 进程优先级
NI — nice值。负值表示高优先级,正值表示低优先级
VIRT — 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
RES — 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
SHR — 共享内存大小,单位kb
S — 进程状态。D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程
%CPU — 上次更新到现在的CPU时间占用百分比
%MEM — 进程使用的物理内存百分比
TIME+ — 进程使用的CPU时间总计,单位1/100秒
COMMAND — 进程名称(命令名/命令行)
显示完整命令: top -c 以批处理模式显示程序信息: top -b 以累积模式显示程序信息: top -S 设置信息更新次数: top -n 2 //表示更新两次后终止更新显示 设置信息更新时间:top -d 3 //表示更新周期为3秒 显示指定的进程信息: top -p 139 //显示进程号为139的进程信息,CPU、内存占用率等
2.4 lsof命令
lsof(list open files)是一个列出当前系统打开文件的工具。在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。所以如传输控制协议 (TCP) 和用户数据报协议 (UDP) 套接字等,系统在后台都为该应用程序分配了一个文件描述符,无论这个文件的本质如何,该文件描述符为应用程序与基础操作系统之间的交互提供了通用接口。因为应用程序打开文件的描述符列表提供了大量关于这个应用程序本身的信息,因此通过lsof工具能够查看这个列表对系统监测以及排错将是很有帮助的。
在终端下输入lsof即可显示系统打开的文件,因为 lsof 需要访问核心内存和各种文件,所以必须以 root 用户的身份运行它才能够充分地发挥其功能。
lsof abc.txt 显示开启文件abc.txt的进程 lsof -c -p 1234 列出进程号为1234的进程所打开的文件 1.列出所有打开的文件: lsof 备注: 如果不加任何参数,就会打开所有被打开的文件,建议加上一下参数来具体定位 2. 查看谁正在使用某个文件 lsof /filepath/file 3.递归查看某个目录的文件信息 lsof +D /filepath/filepath2/ 备注: 使用了+D,对应目录下的所有子目录和文件都会被列出 4. 比使用+D选项,遍历查看某个目录的所有文件信息 的方法 lsof | grep ‘/filepath/filepath2/’ 5. 列出某个用户打开的文件信息 lsof -u username 备注: -u 选项,u其实是user的缩写 6. 列出某个程序所打开的文件信息 lsof -c mysql 备注: -c 选项将会列出所有以mysql开头的程序的文件,其实你也可以写成lsof | grep mysql,但是第一种方法明显比第二种方法要少打几个字符了 7. 列出多个程序多打开的文件信息 lsof -c mysql -c apache 8. 列出某个用户以及某个程序所打开的文件信息 lsof -u test -c mysql 9. 列出除了某个用户外的被打开的文件信息 lsof -u ^root 备注:^这个符号在用户名之前,将会把是root用户打开的进程不让显示 10. 通过某个进程号显示该进行打开的文件 lsof -p 1 11. 列出多个进程号对应的文件信息 lsof -p 123,456,789 12. 列出除了某个进程号,其他进程号所打开的文件信息 lsof -p ^1 13 . 列出所有的网络连接 lsof -i 14. 列出所有tcp 网络连接信息 lsof -i tcp 15. 列出所有udp网络连接信息 lsof -i udp 16. 列出谁在使用某个端口 lsof -i :3306 17. 列出谁在使用某个特定的udp端口 lsof -i udp:55 特定的tcp端口 lsof -i tcp:80 18. 列出某个用户的所有活跃的网络端口 lsof -a -u test -i 19. 列出所有网络文件系统 lsof -N 20.域名socket文件 lsof -u 21.某个用户组所打开的文件信息 lsof -g 5555 22. 根据文件描述列出对应的文件信息 lsof -d description(like 2) 23. 根据文件描述范围列出文件信息 lsof -d 2-3
3.结束进程
kill命令用于删除执行中的程序或工作。
kill可将指定的信息送至程序。预设的信息为SIGTERM(15),可将指定程序终止。若仍无法终止该程序,可使用SIGKILL(9)信息尝试强制删除程序。
杀死进程: kill 12345 //12345是进程的PID 强制杀死进程: kill -KILL 12345 发送SIGHUP信号,可以使用一下信号: kill -HUP pid 彻底杀死进程: kill -9 12345 杀死指定用户所有进程: kill -9 $(ps -ef | grep hnlinux) //方法一 过滤出hnlinux用户进程 或者 kill -u hnlinux 显示信号:kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP 21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR 31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3 38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8 43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2 63) SIGRTMAX-1 64) SIGRTMAX
4.进程中设置环境变量
#include <stdlib.h> int setenv(const char *name, const char *value, int overwrite);
参数说明:
·name :要加入的环境变量名称。
·value :该环境变量的值。
·overwrite :用于指示是否覆盖已存在的重名环境变量。
eg:
#include <stdlib.h> #include <stdio.h> static void set_env_string(void) { setenv("test_env", "test", 1); printf("1. The test_evn string is %s\n", getenv("test_env")); } static void show_env_string(void) { printf("2. The test_env string is %s\n", getenv("test_env")); } int main() { set_env_string(); show_env_string(); return 0; }
结果:
1. The test_evn string is test 2. The test_env string is test
5. 静态库、动态库
《Linux应用编程 —— 动态库与静态库》 - 一个不知道干嘛的小萌新 - 博客园 (cnblogs.com)