Linux学习-程序管理

Linux程序管理。

为啥需要程序管理

  1. 系统资源快要被用光时,怎么找出最耗系统资源的那个程序,然后杀掉它?
  2. 如果一个程序因为自身 bug 一直驻留在内存中,怎么杀掉它?
  3. 如果五六项工作同时运行在系统中,如何让重要的工作优先运行呢?

观察程序状态

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

ps
ps 通常只用两种不同的选项:

- `ps -l` 只查阅自己 bash 中的程序
- `ps aux` 查阅系统中所有的程序

ps -l
结果里面每栏的含义:

- F,process flags,程序旗标,说明这个程序的总结权限。常见号码有:4:程序权限为 root ;1: 程序权限为此子程序仅进行复制(fork)而没有实际运行(exec)
- S,stat,程序的状态。常见状态有:R(Running),运行中;S(Sleep),睡眠状态(idle),可被唤醒(signal);D:不可被唤醒状态,通常是因为这支程序在等待I/O;T(Stop),停止状态,可能是在工作背景中暂停,或是除错(traced)状态;Z(Zombie),僵尸状态,程序已终止但却无法被移出内存;
- UID/PID/PPID,不用再废话了
- C,代表CPU使用率,单位为百分比
- PRI/NI,Priority/Nice 的缩写,代表此程序被CPU所运行的优先顺序,数值越小代表该程序越快被CPU运行
- ADDR,是kernel function,指出该程序在内存的哪个部分,如果是运行中的程序一般显示为`-`
- SZ,代表此程序用掉多少内存
- WCHAN,表示此程序是否在运行中。同样的,若为`-`表示正在运行中
- TTY,登录者的终端机位置,若为远程登陆则使用动态终端介面(pts/n)
- TIME,使用掉的CPU时间
- CMD,command,触发此程序的命令

ps aux
各栏位意义:

- VSZ,该process使用掉的虚拟内存量(Kbytes)
- RSS,该process占用的固定的内存量(Kbytes)
- TTY,该process在哪个终端机上面运行,若为终端机无关则显示`?`;tty1-tty6是本机上面的登陆程序;若为pts/0等,则表示由网络连接进主机的程序
- STAT,运行状态
- START,启动时间
- TIME,使用CPU的时间
- COMMAND,该程序的命令

那么什么是僵尸程序呢?就是CMD后面还有<defunct>的:
僵尸程序
那么怎么处理僵尸程序呢?要么kill,要么重启(reboot)喽!

动态的top

相对于ps是撷取一个时间点的程序状态,top则可以持续侦测程序运行的状态:
top 的用法
top默认是 5 秒更新一次系统资源状态,不过我们可以将其设置为 2 秒:
top -d 2
显示的内容的含义:

  • 第一行(top…):17:03:09(目前时间)、up 7 days, 16:16(系统启动到目前经过的时间)、1 user(登陆系统的使用者一人)、load average: 0.00, 0.00, 0.00(系统在1,5,15分钟的平均工作负载,就是系统平均负责运行几个程序的意思,越小代表系统越闲置,若高于1说明系统里运行程序太繁复了)
  • 第二行(Tasks…):依次是程序的总数以及每种状态的程序总数
  • 第三行(Cpus…):显示的是 CPU 的整体负载,每个项目可使用 ? 查阅。需要特别注意的是 %wa ,那个项目代表的是 I/O wait, 通常你的系统会变慢都是 I/O 产生的问题比较大!因此这里得要注意这个项目耗用 CPU 的资源喔! 另外,如果是多核心的设备,可以按下数字键『1』来切换成不同 CPU 的负载率。
  • 第四行与第五行:表示目前实际内存和虚拟内存的使用情况。(实际内存使用量较大并不一定会导致系统比较卡,因为系统会自动把常用的东西放入内存以便快速响应。而虚拟内存swap如果使用量较大,则表示实际内存不足,会导致系统较卡)
  • 第六行:top程序中输入命令时,显示状态的地方
  • 下面显示栏目的含义:PR,Priority,程序的优先运行顺序,越小越早被运行;NI,Nice,与Priority有关,越小越早被运行;TIME+,CPU使用时间

父子进程树

pstree

管理程序

上面学会了观察程序的状态,那么怎么管理程序呢?所谓管理,也就是要么杀死程序的进程,要么修改程序在CPU上的运行顺序。

杀死进程的kill

kill管理进程的方式:是透过给予一个讯号(signal)去告知该程序你想让她作什么,其实kill的功能也不仅仅是杀死进程的。那么有多少signal呢?每个signal又是什么含义呢?可以使用kill -l或者man 7 signal查询到:
signal

kill必须要加上PID或者job number才能发挥功效,这还得先使用ps或者pstree等命令找到某程序的进程号才行啊,有点麻烦。而killall正是为了解决这一麻烦而生:
killall

程序的运行顺序

CPU根据Priority的值来决定程序的运行顺序,该值越小则表示会优先运行。用户可以通过设置Nice的值来影响Priority,影响公式:PRI(new) = PRI(old) + nice,但是影响之后PRI的值还是会被系统核心动态调整的。要注意:

  • nice值可调整范围:-20~19
  • root可随意调整自己或他人程序的Nice值;一般用户只能调整自己程序的Nice值,且范围为0~19(避免一般用户过分抢占系统资源)

nice:新运行的命令即给予新的nice值

nice

renice:重新调整已存在的程序

renice
从图中可以看出,nice值可以在父程序到子程序之间传递。另外,top命令也可以调整nice的值!

系统资源的观察

free:观察内存使用情况

free
各栏目含义:

  • shared:应该是共享的含义吧
  • buffers:缓冲记忆
  • cached:缓存

uname:查阅系统与核心相关资源

uname

uptime:观察系统启动时间与工作负载

uptime

netstat:追踪网络或插槽档

netstat
图中网络连线(Active Internet connections(w/o servers)各个栏目的含义:

  • Proto:网络封包协议
  • Recv-Q:非由使用者程序连结到此 socket 的复制的总 bytes 数
  • Send-Q:非由远程主机传送过来的 acknowledged 总 bytes 数
  • Local Address:本地端IP:port
  • Foreign Address:远程主机IP:port
  • State:连线状态,主要有创建(ESTABLISED)以及监听(LISTEN)

图中插槽档(socket file)各个栏目的含义:

  • Proto:一般就是unix啦
  • RefCnt:连接到此socket的程序数量
  • Flags:连线的旗标
  • Type:socket存取的类型。主要有确认连线的STREAM与不需要确认的DGRAM两种
  • State:若为CONNECTED表示多个程序之间已经连线创建
  • Path:连接到此socket相关程序的路径,或者相关数据输出的路径

dmesg:分析核心产生的信息

系统启动时,核心会侦测系统硬件,并把侦测结果输出到屏幕(太快了,一闪而过),同时也记录到了内存中的某个保护区段。而dmesg就是把该区段的信息读出来:
dmesg

vmstat:侦测系统资源变化

vmstat可以侦测CPU,内存,磁碟输入输出状态等。如果你想要了解一部繁忙的系统到底哪个环节最累人,可以使用该命令:
vmstat
至于各个栏目的含义,太多了还是直接看鸟哥的解释吧!