简单的Linux系统监控
Linux简单程序管理
监测程序
root@hecs-272453:~# ps
PID TTY TIME CMD
7631 pts/0 00:01:14 supervisord
7690 pts/0 00:00:00 mysqld_safe
7691 pts/0 00:00:15 apache2
8727 pts/0 00:00:00 sh
8751 pts/0 00:00:00 su
610935 pts/0 00:00:00 bash
610996 pts/0 00:00:00 ps
ps命令默认只显示运行在当前终端中属于当前用户的那些进程。在这个例子中,只有bash shell在运行(记住,shell只是运行在系统中的另一个程序而已),当然ps命令本身也在运行。ps命令的基本输出显示了程序的进程ID(process ID,PID)、进程运行在哪个终端(TTY)及其占用的CPU时间。
注意 ps命令令人头疼的地方(也正是它如此复杂的原因)在于它曾经有两个版本。每个版本都有自己的一套命令行选项,控制着显示哪些信息以及如何显示。最近,Linux开发人员已经将这两种ps命令格式合并到单个ps命令中(当然,同时也加入了他们自己的风格)。Linux系统中使用的GNU ps命令支持以下3种类型的命令行选项:
·Unix风格选项,选项前加单连字符;
·BSD 风格选项,选项前不加连字符;
·GNU 长选项,选项前加双连字符。下面将进一步解析这3种选项类型,并举例演示其用法。
1.Unix风格选项
Unix风格选项源自贝尔实验室开发的AT&T Unix系统中的ps命令。这些选项如表4-1所示。
如果需要查看系统中运行的所有进程,可以使用-ef选项组合
root@hecs-272453:~# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 Sep01 ? 00:00:08 /sbin/init noibrs
root 2 0 0 Sep01 ? 00:00:00 [kthreadd]
root 3 2 0 Sep01 ? 00:00:00 [rcu_gp]
root 4 2 0 Sep01 ? 00:00:00 [rcu_par_gp]
root 5 2 0 Sep01 ? 00:00:00 [slub_flushwq]
root 6 2 0 Sep01 ? 00:00:00 [netns]
root 8 2 0 Sep01 ? 00:00:00 [kworker/0:0H-events_highpri]
root 10 2 0 Sep01 ? 00:00:00 [mm_percpu_wq]
这个例子用了两个选项:
-e选项指定显示系统中运行的所有进程
-f选项则扩充输出内容以显示一些有用的信息列
·UID:启动该进程的用户
·PID:进程ID
·PPID:父进程的PID(如果该进程是由另一个进程启动的)
·C:进程生命期中的CPU利用率
·STIME:进程启动时的系统时间
·TTY:进程是从哪个终端设备启动的
·TIME:运行进程的累计CPU时间
·CMD:启动的程序名称
-l选项
root@hecs-272453:~# ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 7631 7609 0 80 0 - 14646 do_pol pts/0 00:01:15 supervisord
4 S 0 7690 7631 0 80 0 - 1158 do_wai pts/0 00:00:00 mysqld_safe
4 S 0 7691 7631 0 80 0 - 133301 do_sel pts/0 00:00:15 apache2
4 S 0 8727 8704 0 80 0 - 1158 do_wai pts/0 00:00:00 sh
4 S 0 8751 8727 0 80 0 - 12319 do_wai pts/0 00:00:00 su
4 S 0 610935 610841 0 80 0 - 2164 do_wai pts/0 00:00:00 bash
4 R 0 613335 610935 0 80 0 - 2517 - pts/0 00:00:00 ps
注意使用了-l选项之后多出的那几列。
·F:内核分配给进程的系统标志。
·S:进程的状态(O代表正在运行;S代表在休眠;R代表可运行,正等待运行;Z代表僵化,已终止但找不到其父进程;T代表停止)
·PRI:进程的优先级(数字越大,优先级越低)
·NI:谦让度(nice),用于决定优先级
·ADDR:进程的内存地址
·SZ:进程被换出时所需交换空间的大致大小
·WCHAN:进程休眠的内核函数地址
2.BSD风格选项
伯克利软件发行版(Berkeley Software Distribution,BSD)是加州大学伯克利分校开发的一个Unix版本
$ ps l
F UID PID PPID PRI NI VSZ RSS WCHAN STAT TTY TIME COMMAND
4 1000 1491 1415 20 0 163992 6580 poll_s Ssl+ tty2 0:00 /usr/li
4 1000 1496 1491 20 0 225176 58712 ep_pol Sl+ tty2 0:05 /usr/li
0 1000 1538 1491 20 0 192844 15768 poll_s Sl+ tty2 0:00 /usr/li
0 1000 2221 2209 20 0 10608 4740 do_wai Ss pts/0 0:00 bash
0 1000 2410 2221 20 0 11396 1156 - R+ pts/0 0:00 ps l
VSZ:进程占用的虚拟内存大小(以KB为单位)
·RSS:进程在未被交换出时占用的物理内存大小
·STAT:代表当前进程状态的多字符状态码。
很多系统管理员喜欢BSD风格的l选项,因为能输出更详细的进程状态码(STAT列)。多字符状态码能比Unix风格输出的单字符状态码更清楚地表明进程的当前状态。
第一个字符采用了与Unix风格的S输出列相同的值,表明进程是在休眠、运行还是等待。
第二个字符进一步说明了进程的状态。·<:该进程以高优先级运行。·N:该进程以低优先级运行。·L:该进程有锁定在内存中的页面。·s:该进程是控制进程。·l:该进程拥有多线程。·+:该进程在前台运行。从先前展示的简单例子中可以看出,bash命令处于休眠状态,但同时它也是一个控制进程(会话中的主进程),而ps命令则运行在系统前台
3.GNU长选项
GNU开发人员在经过改进的新ps命令中加入了另外一些选项,其中一些GNU长选项复制了现有的Unix或BSD风格选项的效果,而另外一些则提供了新功能
--forest选项着实讨人喜欢。该选项能够使用ASCII字符来绘制可爱的图表以显示进程的层级信息:选段
root@hecs-272453:~# ps -ef --forest
root 1089 1 0 Sep01 ? 00:00:00 sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startup
root 610841 1089 0 12:53 ? 00:00:00 \_ sshd: root@pts/0
root 610935 610841 0 12:53 pts/0 00:00:00 \_ -bash
root 613573 610935 0 13:32 pts/0 00:00:00 | \_ ps -ef --forest
root 610950 610841 0 12:53 ? 00:00:00 \_ /usr/lib/openssh/sftp-server
root 1592 1 0 Sep01 ? 00:04:22 ./telescope
这种格式可以轻而易举地跟踪子进程和父进程。
实时监测进程
与ps命令相似,top命令也可以显示进程信息,但采用的是实时方式。
top - 21:10:24 up 10 days, 6:40, 1 user, load average: 0.07, 0.03, 0.00
Tasks: 169 total, 1 running, 168 sleeping, 0 stopped, 0 zombie
%Cpu(s): 1.7 us, 0.2 sy, 0.0 ni, 98.2 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 3719.7 total, 201.9 free, 1160.1 used, 2357.6 buff/cache
MiB Swap: 0.0 total, 0.0 free, 0.0 used. 2226.5 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
8766 lxd 20 0 352172 106016 14464 S 1.7 2.8 225:30.61 opsrv
732 root 20 0 1357412 25580 12056 S 0.3 0.7 11:03.73 containerd
7554 huazi 20 0 3642944 410132 24472 S 0.3 10.8 15:09.12 java
7609 root 20 0 720520 6684 4896 S 0.3 0.2 0:29.88 containerd-shim
937455 lxd 20 0 213008 13220 10836 S 0.3 0.3 0:00.59 postgres
1 root 20 0 167724 12884 7980 S 0.0 0.3 0:09.86 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.03 kthreadd
3 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_gp
4 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_par_gp
输出的第一部分显示的是系统概况:
第一行显示了 当前时间、系统的运行时长、登录的用户数以及系统的平均负载。(平均负载有3个值,分别是最近1分钟、最近5分钟和最近15分钟的平均负载。值越大说明系统的负载越高。由于进程短期的突发性活动,出现最近1分钟的高负载值也很常见。但如果近15分钟内的平均负载都很高,就说明系统可能有问题了。)
第二行显示了进程(top称其为task)概况:多少进程处于运行、休眠、停止以及僵化状态(僵化状态指进程已结束,但其父进程没有响应)
第三行显示了CPU概况。top会根据进程的属主(用户或是系统)和进程的状态(运行、空闲或等待)将CPU利用率分成几类输出
第四行显示了系统的物理内存状态:总共有多少内存、当前用了多少,以及还有多少空闲。
第五行显示了系统交换空间(如果分配了的话)的状态。
最后一部分显示了当前处于运行状态的进程的详细列表,有些列跟ps命令的输出类似。
·PID:进程的PID。
·USER:进程属主的用户名。
·PR:进程的优先级。
·NI:进程的谦让度。
·VIRT:进程占用的虚拟内存总量。
·RES:进程占用的物理内存总量。
·SHR:进程和其他进程共享的内存总量。
·S:进程的状态(D代表可中断的休眠,R代表运行,S代表休眠,T代表被跟踪或停止,Z代表僵化)。
·%CPU:进程使用的CPU时间比例。
·%MEM:进程使用的可用物理内存比例。
·TIME+:自进程启动到目前为止所占用的CPU时间总量。
·COMMAND:进程所对应的命令行名称,也就是启动的程序名。
在默认情况下,top命令在启动时会按照%CPU值来对进程进行排序,你可以在top命令运行时使用多种交互式命令来重新排序。每个交互式命令都是单字符,在top命令运行时键入可改变top的行为。键入f允许你选择用于对输出进行排序的字段,键入d允许你修改轮询间隔(polling interval),键入q可以退出top。用户对top命令输出有很大的控制权。利用该工具,你经常能找出占用系统大量资源的罪魁祸首。
结束进程
进程之间通过信号来通信。进程的信号是预定义好的一个消息,进程能识别该消息并决定忽略还是做出反应。进程如何处理信号是由开发人员通过编程来决定的。大多数编写完善的应用程序能接收和处理标准Unix进程信号
在Linux中有两个命令可以向运行中的进程发出进程信号:kill和pkill。
要发送进程信号,必须是进程的属主或root用户:
TERM信号会告诉进程终止运行。但不服管教的进程通常会忽略这个请求。如果要强制终止,则-s选项支持指定其他信号(用信号名或信号值)
kill -s hub 7554
该命令将“杀死”所有名称以http起始的进程,比如Apahce Web Server的httpd服务
pkill http*