红帽系统管理一 8章节 监控和管理linux进程

列出进程

进程的定义…

程序是指存储在存储设备上(如磁盘)包含了可执行机器指令(二进制代码)和数据的静态实体;而进程可以认为是已经被OS从磁盘加载到内存上的、动态的、可运行的指令与数据的集合,是在运行的动态实体。
在这里插入图片描述

不同的用户登录到系统执行的都是程序/bin/bash来获得终端,不同的用户执行相同的程序登录后获得的权限不同,为什么?因为系统在运行不同用户执行的bash程序时根据每个不同用户的不同的UID/GID启动了带有不同PID的几个不同的进程。而后不同用户在执行自己的命令时,延用自己的权限。

进程组

进程组就是一个或多个进程的集合。这些进程并不是孤立的,他们彼此之间或者存在父子、兄弟关系,或者在功能上有相近的联系。每个进程都有父进程,而所有的进程以init进程为根,形成一个树状结构。同一进程组中的各进程接收来自同一终端的各种信号,每个进程组有一个唯一的进程组ID。每个进程组有一个组长进程,该组长进程的ID等于进程组ID。从进程组创建开始到最后一个进程离开为止的时间称为进程组的生命周期。

那为什么Linux里要有进程组呢?提供进程组就是为了方便对进程进行管理。假设要完成一个任务,需要同时并发100个进程。当用户处于某种原因要终止这个任务时,要是没有进程组,就需要手动的一个个去杀死这100个进程,并且必须要严格按照进程间父子兄弟关系顺序,否则会扰乱进程树。有了进程组,就可以将这100个进程设置为一个进程组,它们共有1个组号(pgrp),并且有选取一个进程作为组长(通常是“辈分”最高的那个,通常该进程的ID也就作为进程组的ID)。现在就可以通过杀死整个进程组,来关闭这100个进程,并且是严格有序的。组长进程可以创建一个进程组,创建该组中的进程,然后终止。只要在某个进程组中有一个进程存在,则该进程组就存在,这与其组长进程是否终止无关。

描述进程的状态

linux进程状态

名称标志内核定义的状态和名称
运行RTASK_RUNNING :表示执行状态或就绪状态;该进程正在执行,或者已经准备就绪,随时开始执行;Linux 内核中,没有对执行状态/就绪状态进行明确的区分;
睡眠STASK-INTERRUPTIBLE,进程正在等待某一条件(硬件请求,系统资源访问或信号等)。条件被满足后,进程将回到运行状态。TASK_INTERRUPTIBLE :表示可中断睡眠状态;进程进入到该状态进行阻塞,一旦执行条件达成立刻中断阻塞,开始执行进程,进入TASK_RUNNING 状态;该状态又称为"浅睡眠状态";
睡眠DTASK_UNINTERRUPTIBLE:表示不可中断睡眠状态;可以被等待的资源唤醒,但是不能被signal唤醒;使用 ps aux 命令查看进程时,标记为 D 的状态是该 TASK_UNINTERRUPTIBLE 状态,该状态下的进程不能被信号杀死;此状态又称为深度睡眠状态。一般是在等待磁盘IO
睡眠KTASK_KILLABLE :与TASK_UNINTERRUPTIBLE状态相同,可以被等待的资源唤醒,不同于TASK_UNINTERRUPTIBLE不能被信号唤醒,TASK_KILLABLE允许被一个特殊的信号唤醒,即死亡信号9(醒后即死)。
睡眠ITASK_REPORT_IDLE:类似K。和K一样是D状态的一个子集,系统计算负载平均值时,不会统计这些进程。也接受致命信号。
已停止TTASK_STOPPED:进程已停止,通常是因为用户或者其他进程发出的信号,停止的进程可以接收信号返回到运行状态中
僵停ZEXIT_ZOMBIE:子进程退出时向父进程发出信号。除进程ID(PID)外的所有资源均被释放
僵停XEXIT_DEAD:父进程清理剩余的子进程,进程已彻底释放

注意:
TASK_INTERRUPTIBLE(浅度睡眠):可以被等待的资源唤醒,也能被signal唤醒;
TASK_UNINTERRUPTIBLE(深度睡眠):可以被等待的资源唤醒,但是不能被signal唤醒
TASK_KILLABLE :与TASK_UNINTERRUPTIBLE状态相同,可以被等待的资源唤醒,不同于TASK_UNINTERRUPTIBLE不能被信号唤醒,TASK_KILLABLE只允许被一个特殊的信号唤醒,即死亡信号9(醒后即死)。

top 命令的s列或ps 命令的STAT列显示每个进程的状态。会有多个R,但每个内核只运行一个进程。

列出进程

ps top 命令可以提供详细的进程信息。

[root@#test ~]# ps aux
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root          1  0.0  0.3 190976  3900 ?        Ss   08:18   0:01 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root          2  0.0  0.0      0     0 ?        S    08:18   0:00 [kthreadd]

控制作业

作业

什么是linux作业?
在Linux系统中,作业(job)是指在shell中运行的一个进程或一组进程。当我们在shell中运行一个命令时,该命令就会成为一个作业。作业可以在前台或后台运行,可以暂停、恢复、终止等操作。

为什么要进作业控制?作业控制是在bash环境下,在单一终端机环境下同时进行多个工作的行为管理。例如我们在登录bash后,想要一边编译某个程序,同时编辑某个文本文件,通过作业控制可以做到。

会话

什么是会话?个人理解:会话就是当前终端运行的所有进程或者大部分进程的集合。
会话包含一个前台进程组和一个或多个后台进程组。假设我们只有一个终端,那么出现提示符让你操作的就是前台进程。
一次只能有一个作业从终端窗口读取(输入和键盘生成的)信号,并且这个进程一定是前台进程。
终端的后台进程无法从终端读取的中断信号或接受键盘生成的中断信号,但是可以写入终端。如果某个后台进程尝试读取终端内容,那么这个后台进程将会暂停。
ps命令的tty列显示进程的控制终端设备名称。某些进程由系统启动,没有控制终端,tty列显示问号?
在这里插入图片描述

将命令丢到后台运行

大多数命令或者管道都可以在后台运行,只需要在命令的末尾加上符号&,此时bash会显示作业编号和新建的子进程的PID。bash不会等待命令执行完毕。

[root@#test ~]# sleep 10000 &
[1] 6808

注意:如果利用&将包含管道的命令发送到后台,将会输出管道中最后一个命令的PID。但管道中的所有进程仍是该作业的成员。

查看当前的后台的工作的状态:

命令jobs
不加参数:列出所有的后台作业
-l :同时列出PID
-r:仅列出正在后台run的工作
-s:仅列出在后台暂停(stop)的工作

[root@#test ~]# jobs -l
[1]   6808 运行中               sleep 10000 &
[2]-  6895 停止                  vi ~/.bashrc
[3]+  6896 停止                  find / -print

关于作业编号后面的±号:+表示此进程是默认的取用进程,即此时在bash中输入命令fg,这个进程会被拿到前台运行。+号还表示这是最近的被丢到后台的进程,-表示倒数第二个被丢进后台的进程。

将后台进程拿到前台工作

命令fg:(foreground)
不加参数:将jobs列表里带+的进程拿到前台
%jobnumber:将作业编号为[jobnumber]的作业拿到前台。符号%不是必须的。

启动在后台暂停的作业

命令bg:(background)
%jobnumber:将作业编号为[jobnumber]的作业在后台继续执行。符号%不是必须的。

中断进程

使用信号控制进程

信号是什么?Linux中控制进程的信号是信号量(Signal)。信号是一种软件中断,用于通知进程发生了某个事件。生成信号的可以是错误或者外部事件(如IO请求,定时器过期等),也可以来自于显式的信号发送命令,或者键盘。

基本的进程控制信号

信号编号名称内容
1SIGHUP启动被终止的进程,可以让进程重新读取其配置文件,重新加载,类似于重启
2SIGINT相当于键盘Ctrl+c来中断一个进程
9SIGKILL死亡信号,无法拦截,强制中断,如果此时进程进行到一半可能会产生副“产品”,例如vim被9中断,会生成.filename.swp的文件保留下来
15SIGTERM正常的终止一个进程,可以被拦截,忽略。是一种友好的要求进程终止的方式
17SIGSTOP相当于键盘ctrl+z中断一个进程

注意:信号编号受不同的硬件平台影响是不统一的,但是信号名称和含义在各平台间是始终统一的,故建议使用信号名称。

通过明确的请求或者命令发送信号

ctrl+c或ctrl+z或ctrl+/可以控制前台进程
但是想要控制后台进程需要使用 kill 或killall 命令。
用户可以终止自己的进程,但是需要有root特权才可以终止其他用户的进程。
kill 命令根据进程的PID向进程发送信号,kill可以发送任何信号,而不是仅仅只有死亡信号。
查看kill具体的可用信号?

[root@#test ~]# 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	

kill 命令格式

[root@#test ~]# kill -signal %jobnumber
signal:可以是编号或者名称,如果不写signal参数,默认为15,即正常的终止。

killall 命令,用来结束同名的的所有进程。此外killall 还有大量其他参数,可查看手册。

[root@#test ~]# yum install -y psmic

[root@#test ~]# killall -9  bash  #bash为进程名

pkill命令,向一个或者多个符合条件的进程发送信号。包括含下高级筛选条件。

1.命令名——具有模式匹配的命令名称的进程
2.UID ——由某一个linux用户账户创建的进程,不论是是不是真实的,有效的
3.GID ——由某一个linux组账户创建的进程
4.父级——由特定的父级创建的子进程
5.终端——由特定的用户终端连接创建的子进程

命令选项
-o:仅向找到的最小(最老)进程号发送信号;
-n:仅向找到的最大(最新)进程号发送信号;
-P:指定父进程号发送信号;
-g:指定进程组;
-t:指定开启进程的终端。
-u:指定用户的进程

以管理员身份注销用户

当用户进行了诸如非法访问等操作,我们可能需要注销某个用户。在注销某个用户之前,首先要终止用户的对话,w命令可以列出前用户的登录状态和进程情况。记录tty列和from列,以确定要关闭的会话。
所有的用户登录会话都与某个终端设备(tty)相关。tty列记录为pts/N,说明此会话来自图形终端窗口或远程登录会话相关联的终端。记录为ttyN说明这是 一个系统控制台等。
JCPU记录会话当前作业耗用的cpu资源(前台,后台及后台的子进程)。
PCPU记录会话当前的前台进程耗用的cpu资源。

[root@#test ~]# w
 13:50:11 up  5:37,  2 users,  load average: 0.07, 0.04, 0.05
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
guojie   tty1                      13:50   11.00s  0.01s  0.01s -bash
root     pts/0    192.168.26.1     08:52    3.00s  0.05s  0.00s w

可以逐一的终止进程也可以通过pkill 终止某一用户的所有进程。由于登录会话的初始进程(会话首进程)设计为可以处理会话终止请求并忽略来自键盘中断信号,所以想要中断用户的所有进程和登录shell 需要适用SIGKILL,即信号9。

注意:因为SIGKILL 总是不可忽略而致命的,红帽官方建议系统管理员先发送SIGTERM(15),然后尝试SIGHUP(1)重启。在这两个进程都失败后才通过SIGKILL终止。

首先使用pgrep确定要中断的PID编号,在使用pkill 终止进程

[root@#test ~]# pgrep -l -u guojie
8002 bash
[root@#test ~]# pkill -9 -u guojie
[root@#test ~]# 
[root@#test ~]# pgrep -l -u guojie
[root@#test ~]# 

监控进程活动

什么是Load Average?
系统负载(System Load)是系统CPU繁忙程度的度量,即有多少进程在等待被CPU调度(进程等待队列的长度)。

平均负载(Load Average)是一段时间内系统的平均负载,这个一段时间一般取1分钟、5分钟、15分钟。

如何查看Load Average?
top命令,w命令,uptime等命令都可以查看系统负载;

[root@#test ~]# uptime
 16:32:12 up  8:14,  2 users,  load average: 1.01, 2.01, 2.99

Load Average的3个数值各是什么意思?
第一位1.01:表示最近1分钟平均负载
第二位2.01:表示最近5分钟平均负载
第三位2.99:表示最近15分钟平均负载

Load Average值的含义:
1、单核处理器(例如:1个1核cpu)
假设我们的系统是单CPU单内核的,把它比喻成是一条单向马路,把CPU任务比作汽车。
当车不多的时候,load <1;
当车占满整个马路的时候 load=1;
当马路都站满了,而且马路外还堆满了汽车的时候,load>1;

2、多核处理器 (例如:2个cpu或一个2核的cpu)
我们经常会发现服务器Load > 1但是运行仍然不错,那是因为服务器是多核处理器(Multi-core)。
假设我们服务器一个CPU是2核,那么将意味我们拥有2条马路,我们的Load = 2时,所有马路都跑满车辆。

提示:
芯片厂商往往在一个CPU内部,包含多个CPU核心,这被称为多核CPU。
在系统负荷方面,多核CPU与多个CPU效果类似,所以考虑系统负荷的时候,必须考虑这台电脑有几个CPU、每个CPU有几个核心。然后,把系统负荷除以总的核心数,只要每个核心的负荷不超过1.0,就表明电脑正常运行。

怎么知道Linux服务器有多少个CPU核心呢?
查看cpu信息命令:
cat /proc/cpuinfo
查看cpu总核心数命令:
grep -c ‘model name’ /proc/cpuinfo

什么样的Load Average值得警惕(单核)?
Load < 0.7时:系统很闲,马路上没什么车,要考虑多部署一些服务
0.7 < Load < 1时:系统状态不错,马路可以轻松应对
Load == 1时:系统马上要处理不多来了,赶紧找一下原因
Load > 1时:马路已经非常繁忙了,进入马路的每辆汽车都要无法很快的运行

三种Load Average值,应该看哪个(单核)?
通常我们先看15分钟load,如果load很高,再看1分钟和5分钟负载,查看是否有下降趋势。
1分钟负载值 > 1,那么我们不用担心,但是如果15分钟负载都超过1,我们要赶紧看看发生了什么事情。所以我们要根据实际情况查看这三个值。
现在相信大家都知道,“load average"一共返回三个平均值:1分钟系统负荷、5分钟系统负荷,15分钟系统负荷;
如果只有1分钟的系统负荷大于1.0,其他两个时间段都小于1.0,这表明只是暂时现象,问题不大。
如果15分钟内,平均系统负荷大于1.0(调整CPU核心数之后),表明问题持续存在,不是暂时现象。所以,你应该主要观察"15分钟系统负荷”,将它作为电脑正常运行的指标。

结合具体情况具体分析(单核):
1分钟Load>1,5分钟Load<1,15分钟Load<1:短期内繁忙,中长期空闲,初步判断是一个“抖动”,或者是“拥塞前兆”
1分钟Load>1,5分钟Load>1,15分钟Load<1:短期内繁忙,中期内紧张,很可能是一个“拥塞的开始”
1分钟Load>1,5分钟Load>1,15分钟Load>1:短、中、长期都繁忙,系统“正在拥塞”
1分钟Load<1,5分钟Load>1,15分钟Load>1:短期内空闲,中、长期繁忙,不用紧张,系统“拥塞正在好转”

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值