简单的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所示。
image

如果需要查看系统中运行的所有进程,可以使用-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版本

image

$ 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风格选项的效果,而另外一些则提供了新功能

image

--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进程信号

image

在Linux中有两个命令可以向运行中的进程发出进程信号:kill和pkill。
要发送进程信号,必须是进程的属主或root用户:

TERM信号会告诉进程终止运行。但不服管教的进程通常会忽略这个请求。如果要强制终止,则-s选项支持指定其他信号(用信号名或信号值)

kill -s hub 7554

该命令将“杀死”所有名称以http起始的进程,比如Apahce Web Server的httpd服务

pkill http*
posted @ 2023-09-11 21:30  向qian看!  阅读(60)  评论(0编辑  收藏  举报