八、系统管理体系

发布时间 2023-05-28 01:27:01作者: lichengbo

系统管理体系

1. 系统管理体系之进程管理

1.1 什么是进程?

  • 进程process:运行起来的程序,软件,命令。
  • 程序软件:存放在磁盘上面的程序代码。

1.2 进程,程序,守护进程(服务)?

  • 进程process:运行起来的程序,软件,命令。
  • 程序软件:存放在磁盘上面的程序代码。
  • 守护进程(服务):持续运行的进程,这些一般是系统必备进程(服务软件),eg:网络 日志 定时任务 其他

服务/守护进程:通过 systemctl控制

1.3 进程的生命周期

1)进程正常处理流程:
  • 子进程在处理任务代码时,父进程会进入等待状态中...
  • 子进程在处理任务代码后,会执行退出,然后唤醒父进程来回收子进程的资源。
  • 异常情况:如果子进程在处理任务过程中异常退出,而父进程没有回收子进程的资源
2)僵尸进程
  • 僵尸进程是当子进程必父进程先结束,而父进程又没有回收子进程,释放子进程占用的资源,此时子进程将成为一个僵尸进程。

3)孤儿进程
  • 孤儿进程指的是在其父进程执行完成或被终止后仍继续运行的一类进程。
  • 孤儿进程会被系统直接接管。(systemd进程)

4)异常进程处理方案:

a)僵尸进程

  • 处理,通过正常kill命令无法杀掉
  • 处理方案:结束他的父进程,最终方案重启Linux系统

b)孤儿进程

  • 结束孤儿进程,重启对应服务

c)模拟

  • 孤儿进程
#准备
pkill nginx 
ps -ef |grep nginx 
yum install -y nginx 
#模拟
systemctl  start nginx  
[root@lichengbo-nb ~]# pstree -p
           ├─nginx(29053)───nginx(29054)   #nginx正常运行 29053 父进程   29054子进程
[root@lichengbo-nb ~]# kill -9 29053 #强制结束父进程
[root@lichengbo-nb ~]# 
[root@lichengbo-nb ~]# pstree -p
           ├─nginx(29054)                    #子进程成为孤儿被系统进程systemd接管.
           
#解决
[root@lichengbo-nb ~]# pstree -p
           ├─nginx(29054)
[root@lichengbo-nb ~]# kill 29054 #子进程结束
[root@lichengbo-nb ~]# systemctl start   nginx   #重启服
  • 僵尸进程
vim zombine.c
#include <sys/types.h>
#include <sys/wait.h>
#include <errno.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
/*
 desc: 用于模拟僵尸进程.代码. oldboyedu.com
*/
int main(int argc, char *argv[])
{
pid_t pid;
pid = fork();
if (pid == 0) {
int iPid = (int)getpid();
fprintf(stderr,"I am child,%d\n",iPid);
sleep(1);
fprintf(stderr, "Child exits\n");
return EXIT_SUCCESS;
}
int iPid = (int)getpid();
fprintf(stderr,"I am parent,%d\n",iPid);
fprintf(stderr, "sleep....\n");
sleep(600);
fprintf(stderr, "parent exits\n");
return EXIT_SUCCESS;
}
#编译c语言代码,生成命令
gcc zombine.c  -o zombine.bin
#检查
[root@lichengbo-nb /oldboy]# ll zombine.*
-rwxr-xr-x. 1 root root 8648 Mar 23 10:35 zombine.bin
-rw-r--r--. 1 root root  591 Mar 23 10:35 zombine.c
#开始模拟
root@lichengbo-nb /oldboy]# ./zombine.bin 
I am parent,30037
sleep....
I am child,30038
Child exits
#再开个窗口 进行操作
##检查僵尸进程
[root@lichengbo-nb ~]# ps aux |grep Z
USER       PID %CPU %MEM   VSZ   RSS TTY     STAT START   TIME COMMAND
root      30055  0.0  0.0      0     0 pts/0   Z+   10:36   0:00 [zombine.bin] <defunct>  #这个就是僵尸进程
root      30169  0.0  0.0 112808   948 pts/1   R+   10:38   0:00 grep --color=auto Z 
##尝试结束僵尸进程
kill
kill -9
##尝试结束僵尸进程父进程.
[root@lichengbo-nb ~]# pstree -p |grep zombine 
           |-sshd(1473)-+-sshd(1731)---bash(1735)---zombine.bin(30054)---zombine.bin(30055)
kill 30054
.
##检查结果
[root@lichengbo-nb ~]# pstree -p |grep zombine 
[root@lichengbo-nb ~]# ps aux |grep Z
USER       PID %CPU %MEM   VSZ   RSS TTY     STAT START   TIME COMMAND
root      30247  0.0  0.0 112808   948 pts/1   R+   10:40   0:00 grep --color=auto Z

1.4 进程监控指令

  • ps
  • top
1)ps显示进程信息(静态)
ps -ef  #简单信息  pid  ppid
ps aux  

a)ps aux每一列含义

每一列
第一列:User 进程属于用户
第二列:PID 进程号(子进程号)
第三列:%CPU cpu使用率
第四列:%MEM 内存使用率
第五列:VSZ 进程占用虚拟内存大小(KB)
第六列:RSS 进程占用物理内存大小(KB)
第七列:TTY 用户使用终端(用户连接进来后,系统创建)
第八列:STAT 进程状态
第九列:START 进程启动时间
第十列:TIME 进程占用CPU时间
第十一列及最后:COMMAND 进程名字(命令,选项...)[]括起来的是内核进程,其他是系统进程 systemd pid是1,第1个进程

b)ps aux中 VSZ vs RSS区别

#VSZ:Virtual size 进程占用虚拟内存大小
虚拟内存=swap+物理内存

#RSS:resident size 进程占用物理内存大小

c)ps aux 中进程状态

STAT基本状态 描述
R(running) 进程运行
S 可中断进程(随时可以停止)
T(terminate) 进程被暂时(挂起)ctrl+z
D 不可终端进程(IO读写)
Z(zombie) 僵尸进程
STAT状态+符号(附加状态) 描述
s 进程是控制进程,Ss进程的领导者,父进程
< 进程运行在高优先级上,S<优先级较高的进程
N 进程运行在低优先级上,SN优先级较低的进程
+ 当前进程运行在前台,R+该表示进程在前台运行
l(小写L) 进程是多线程的,Sl表示进程是以线程方式运行(与程序)
#进程 vs 线程  概述

进程:运行起来的程序或命令,用于在内存中占用资源与空间
线程:进程内部,实际处理用户请求,数据。软件/服务是否有线程,与开发、代码相关。

d) aux中进程状态-组合与案例

  • R+ 前台正在运行的进程
root      34952 30.7  0.0 108096   500 pts/1   R+   12:02   0:11 dd if=/dev/zero of=/tmp/big bs=1k 
count=999999999
root      34988  0.0  0.0 112808   960 pts/0   R+   12:02   0:00 grep --color=auto dd
  • R 正在运行的进程(后台)
dd if=/dev/zero of=/tmp/big   bs=1k   count=9999999 &
ps aux |grep dd 
root      35037 61.0  0.0 108096   616 pts/1   R    12:04   0:01 dd if=/dev/zero of=/tmp/big bs=1k count=9999999
  • S 可终端进程
大部分都是 S
  • T 进程被后台挂起(ctrl+z)
vim /etc/hosts 
ctrl + z
[root@lichengbo-nb ~]# vim /etc/hosts 
[1]+ Stopped                 vim /etc/hosts
[root@lichengbo-nb ~]# ps aux |grep vim 
root      35171  0.3  0.2 149604  5364 pts/0   T    12:06   0:00 vim /etc/hosts
#fg命令 回到前台,继续运行.
  • D 不可终端进程 D+
[root@lichengbo-nb ~]# tar zcf /tmp/etc.tar.gz     /etc/
tar: Removing leading `/' from member names

[root@lichengbo-nb ~]# ps aux |grep tar 
root      35263  2.0  0.0 123612  1296 pts/1   D+   12:08   0:00 tar zcf /tmp/etc.tar.gz /etc/
  • Ss 可中断进程,管理进程(主进程)
[root@lichengbo-nb ~]# systemctl start nginx 
[root@lichengbo-nb ~]# 


[root@lichengbo-nb ~]# ps aux |grep nginx 
root      29229  0.0  0.0  39308   936 ?       Ss   10:20   0:00 nginx: master process /usr/sbin/nginx
nginx     29231  0.0  0.0  39696  1512 ?       S    10:20   0:00 nginx: worker process
  • S< 可中断进程,高优先级
好多都是
  • Ssl 可中断进程,管理进程(主进程),多线程
yum install -y mariadb-server 
systemct start mariadb  
[root@lichengbo-nb ~]# ps aux |grep mysql  
mysql     34354  0.0  0.0 113412   500 ?       Ss   11:55   0:00 /bin/sh /usr/bin/mysqld_safe --basedir=/usr
mysql     34520  0.0  3.7 968920 75420 ?       Sl   11:55   0:00 /usr/libexec/mysqld --basedir=/usr --
datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysql/plugin --log-error=/var/log/mariadb/mariadb.log --pid-file=/var/run/mariadb/mariadb.pid --socket=/var/lib/mysql/mysql.sock
root      35467  0.0  0.0 112808   964 pts/0   S+   12:11   0:00 grep --color=auto mysql
  • 统计每个进程类型的数量
[root@lichengbo-nb ~]# ps aux |awk '{print $8}' |sort | uniq -c
      1 R+
     32 S
     64 S<
      3 S+
      2 SN
     16 Ss
      1 Ss+
      5 Ssl
      1 S<sl
      1 STAT

#企业应用关注点:Z僵尸 D进行io的进程
2)top显示进程信息(动态)

a)整体讲解

b)CPU相关

任务 含义
Tasks:129 total 当然进程的总数
1 running 正在运行的进程数
128 sleeping 睡眠的进程数
0 stopped 体质的进程数
0 zombie 僵尸进程数
CPU相关:%Cpu(s):0.7us user 系统用户进程使用CPU百分比(压缩,转码,加密)
0.7 sy system 内核中的进程占用CPU百分比,通常内核是于硬件进行交互(硬件设备,网卡,硬盘)
ni 优先级高的进程占用的百分比
98.7 id idle 空闲CPU的百分比
0.0 wa iowait CPU等待IO完成的时间(用户请求资源很多,磁盘)
0.0 hi 硬中断,占的CPU百分比
0.0 si 软中断,占的CPU百分比
0.0 st 比如虚拟机占用物理CPU的时间
  • 中断:中断是指计算机运行过程中,出现某些意外情况需主机干预时,机器能自动停止正在运行的程序并转入处理新情况的程序,处理完毕后又返回原被暂停的程序继续运行。

c) 内存相关

  • Linux内存机制概述:内存被吃了

[root@lichengbo-nb ~]# free -h
             total       used       free     shared buff/cache   available
Mem:           1.9G       187M        1.7G        1.8M         89M        1.6G
Swap:          2.1G       207M        1.9G

[root@lichengbo-nb ~]# dd if=/dev/zero of=/tmp/big bs=1M count=1000
1000+0 records in
1000+0 records out
1048576000 bytes (1.0 GB) copied, 1.3889 s, 755 MB/s
[root@lichengbo-nb ~]# free -h
             total       used       free     shared buff/cache   available
Mem:           1.9G       188M       676M        1.8M        1.1G        1.6G
Swap:          2.1G       206M        1.9G


#这是linux正常的机制.
#linux会把我们用过文件,内容临时存放在内存中.
#这种存放会占用内存空间,存放专用区域 buffer/cache区.
#所以基于这个特点:当前实际可用的内存: free+buffer/cache ~ available(可用内存)

参考网站: https://www.linuxatemyram.com/
  • buffer / cache (内存)
buffer 缓冲区 内存中一块区域,主要用来加速写入. 写buffer 写缓冲
cache   缓存区 内存中一块区域,主要用来加速读取, 读cache   读缓存
  • 未来架构优化的目标了解: 尽可能让用户访问缓存中的数据.(内存,软件.....)
3) ps和top实战-案例

ps 相关案例


a) 案例01 检查系统进程状态与信息(crond)

ps -ef |grep crond
ps aux |grep crond 

b)案例02 按照树形结构查看进程信息

pstree  # -p 显示进程及pid信息
ps auxf   #以树形显示进程信息,详细信息
root       1473  0.0  0.0 112900   256 ?       Ss   Mar17   0:00 /usr/sbin/sshd -D
root      33187  0.0  0.0 158904   332 ?       Ss   11:36   0:00 \_ sshd: root@pts/1
root      33192  0.0  0.1 116600  2164 pts/1   Ss   11:36   0:00 |   \_ -bash
root      45709  0.0  0.0 155584  1932 pts/1   R+   15:37   0:00 |       \_ ps auxf
root      44542  0.0  0.2 158904  5580 ?       Ss   15:15   0:00 \_ sshd: root@pts/0
root      44547  0.0  0.1 116468  2992 pts/0   Ss   15:15   0:00     \_ -bash
root      44756  0.0  0.1 162096  2220 pts/0   S+   15:18   0:01         \_ top

c) 案例03 根据要求,只显示某些内容.

  • 基本取出来
#方法01 通过ps aux/ps -ef + awk处理.
ps aux |awk  '{print $1,$2,$3,$4,$11}'

#方法02 通过ps命令选项实现

ps  -xo user,pid,%cpu,%mem,command
  • 取出索要内容,不显示标题
#方法01 通过ps aux/ps -ef + awk处理.

ps aux |awk  'NR>1 {print $1,$2,$3,$4,$11}'


#方法02 通过ps命令选项实现

ps  --no-heading  -xo user,pid,%cpu,%mem,command

d) 案例04 取出某一个服务(crond)的进程信息(pid,%cpu,%mem,command)

ps  --no-heading  -xo user,pid,%cpu,%mem,command |grep crond 


[root@lichengbo-nb ~]# ps --no-heading -xo user,pid,%cpu,%mem,command |grep crond 
root       1046  0.0  0.0 /usr/sbin/crond -n
root      46223  0.0  0.0 grep --color=auto crond

e) 案例05 取出所有进程中内存使用率最高的前5

#方法01 ps aux |sort |head 
ps aux |sort -rnk4   |head -5


#方法02 ps + head 
ps aux  --sort=%mem |tail -5

ps aux  --sort=-%mem |head 

top实战案例


a) 案例01 : top基础使用与快捷键

#默认按照cpu使用率排序: P  
#按照内存使用率排序 : M
#立刻刷新: 空格
#进阶用法: top输入z进入颜色模式 按 x 标记出当前是按照哪列排序.
 shift + > 向右
 shift + < 向左



#其他了解
#top熟悉了解的快捷键
h 查看帮出
z   以彩色信息展示 x   
1 显示所有CPU的负载
s 设置刷新时间
b 高亮现实处于R状态的进程
M 按内存使用百分比排序输出
P 按CPU使用百分比排序输出
R 对排序进行反转
f 自定义显示字段
k kill掉指定PID进程
W 保存top环境设置 ~/.toprc

b) 案例02: 非交互模式

# -p 只显示某个进程的信息 -p pid 
# -b 批量处理模式,top命令结果批量写入文件 一般配合-n 方便把结果保存,方便其他命令二次处理
# -n 批处理模式,显示几次
# -d 修改top命令刷新间隔 -d 1 

#01 通过-p查看指定进程信息
[root@lichengbo-nb ~]# top -p 1046
top - 16:05:38 up 6 days,  1:19,  3 users, load average: 0.59, 0.31, 0.15
Tasks:   1 total,   0 running,   1 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.3 us,  0.0 sy,  0.0 ni, 99.7 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  2027868 total,   684180 free,   194852 used,  1148836 buff/cache
KiB Swap:  2201556 total,  1993020 free,   208536 used.  1672244 avail Mem 
   PID USER     PR NI   VIRT   RES   SHR S %CPU %MEM     TIME+ COMMAND                                       
                                                         
  1046 root      20   0  126384    440    332 S  0.0  0.0   0:01.70 crond        
  
#02 非交互模式 -b   批处理模式,一般用于取出想要内容,写入到文件.
ps -ef |grep crond 
定时任务的pid是 1046
top -b -n1  -p 1046

c) 案例03 : 显示多线程服务的线程信息

[root@lichengbo-nb ~]# ps aux |grep mysql 
mysql     34354  0.0  0.0 113412     8 ?       Ss   11:55   0:00 /bin/sh /usr/bin/mysqld_safe --basedir=/usr
mysql     34520  0.0  0.3 968920  7196 ?       Sl   11:55   0:07 /usr/libexec/mysqld --basedir=/usr --
datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysql/plugin --log-error=/var/log/mariadb/mariadb.log --pidfile=/var/run/mariadb/mariadb.pid --socket=/var/lib/mysql/mysql.sock
root      47371  0.0  0.0 112808   968 pts/1   S+   16:10   0:00 grep --color=auto mysql


top -p 34520
[root@lichengbo-nb ~]# top -p 34520
top - 16:10:53 up 6 days,  1:24,  3 users, load average: 0.06, 0.13, 0.12
Tasks:   1 total,   0 running,   1 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us,  0.0 sy,  0.0 ni, 99.7 id,  0.0 wa,  0.0 hi,  0.3 si,  0.0 st
KiB Mem :  2027868 total,   680816 free,   195324 used,  1151728 buff/cache
KiB Swap:  2201556 total,  1993400 free,   208156 used.  1671720 avail Mem 
   PID USER     PR NI   VIRT   RES   SHR S %CPU %MEM     TIME+ COMMAND                                       
                                                         
34520 mysql     20   0  968920   7196      0 S  0.3  0.4   0:07.67 mysqld                                       
                                                          
top -Hp 34520
[root@lichengbo-nb ~]# top -Hp 34520
top - 16:11:21 up 6 days,  1:24,  3 users, load average: 0.03, 0.11, 0.12
Threads:  19 total,   0 running,  19 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us,  0.3 sy,  0.0 ni, 99.7 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  2027868 total,   680816 free,   195324 used,  1151728 buff/cache
KiB Swap:  2201556 total,  1993404 free,   208152 used.  1671720 avail Mem 
   PID USER     PR NI   VIRT   RES   SHR S %CPU %MEM     TIME+ COMMAND                                       
                                                         
34520 mysql     20   0  968920   7196      0 S  0.0  0.4   0:00.13 mysqld                                       
                                                          
34524 mysql     20   0  968920   7196      0 S  0.0  0.4   0:00.29 mysqld                                       
                                                          
34525 mysql     20   0  968920   7196      0 S  0.0  0.4   0:00.31 mysqld                                       
                                                          
34526 mysql     20   0  968920   7196      0 S  0.0  0.4   0:00.39 mysqld                                       
                                                          
34527 mysql     20   0  968920   7196      0 S  0.0  0.4   0:00.47 mysqld                                       
                                                          
34528 mysql     20   0  968920   7196      0 S  0.0  0.4   0:00.34 mysqld  

34529 mysql     20   0  968920   7196      0 S  0.0  0.4   0:00.45 mysqld                                       
                                                          
34530 mysql     20   0  968920   7196      0 S  0.0  0.4   0:00.51 mysqld                                       
                                                          
34531 mysql     20   0  968920   7196      0 S  0.0  0.4   0:00.34 mysqld                                       
                                                          
34532 mysql     20   0  968920   7196      0 S  0.0  0.4   0:00.32 mysqld                                       
                                                          
34533 mysql     20   0  968920   7196      0 S  0.0  0.4   0:00.32 mysqld                                       
                                                          
34534 mysql     20   0  968920   7196      0 S  0.0  0.4   0:01.16 mysqld                                       
                                                          
34535 mysql     20   0  968920   7196      0 S  0.0  0.4   0:02.05 mysqld                                       
                                                          
34536 mysql     20   0  968920   7196      0 S  0.0  0.4   0:00.32 mysqld                                       
                                                          
34537 mysql     20   0  968920   7196      0 S  0.0  0.4   0:00.05 mysqld                                       
                                                          
34538 mysql     20   0  968920   7196      0 S  0.0  0.4   0:00.01 mysqld                                       
                                                          
34539 mysql     20   0  968920   7196      0 S  0.0  0.4   0:00.00 mysqld                                       
                                                          
34548 mysql     20   0  968920   7196      0 S  0.0  0.4   0:00.03 mysqld                                       
                                                          
34549 mysql     20   0  968920   7196      0 S  0.0  0.4   0:00.00 mysqld 

2. 进程管理-后台运行

  • 前台: 占用我们窗口(终端)
  • 后台:

1.1 概述

前台/后台 基本介绍 特点
前台 占用我们窗口(终端) (进程标记+) 始终开启窗口(终端),如果终端断开,操作就结束了.
后台 一般是系统服务软件 即使连接断开也不会影响操作.

1.2 常用方案

后台运行方案 概述 应用场景
& (and) 让程序进程后台运行. 大部分命令后台运行,缺点输出到屏幕,
但是可以通过重定向方法保存输出.
ctrl + z 然后按bg 后台挂起,bg继续后台运行. 1. 前台进程,转入后台运行.
2. 结束顽固的服务/命令.|
ctrl+z,bg,kill
screen 创建虚拟空间,让服务/命令在这个空间中运行. 相当于是后台运行. 更稳定的后台运行命令/进程方式.
screen里面运行的命令,外部看不到
nohup xxxx & 与第1个类似,会生成日志. 更稳定的后台运行命令/进程方式.
screen里面运行的命令,外部看不到
1) &符方案 ?????
#案例01 让某个命令/进程进入后台运行  
[root@lichengbo-nb ~]# sleep  88  &
[1] 2160                                          #2160 后台进程的pid.
[root@lichengbo-nb ~]# ps aux |grep sleep 
root       2160  0.0  0.0 108052   356 pts/0    S    09:39   0:00 sleep 88
root       2162  0.0  0.0 112808   968 pts/0    S+   09:39   0:00 grep --color=auto sleep

#如果后台运行结束:屏幕提示:
[1]+  Done                    sleep 88
      结束 

#交互式命令不推荐后台: passwd,vim,top,htop..
2) ctrl+z 然后使用bg
#案例01  让命令进入后台运行
#刚开始使用的时候是前台运行,运行的时候转入后台运行
[root@lichengbo-nb ~]# sleep 88 
^Z                                     #按ctrl+z 
[1]+  Stopped                 sleep 88   #后台挂起 
[root@lichengbo-nb ~]# ps aux |grep sleep 
root       2178  0.0  0.0 108052   352 pts/0    T    09:44   0:00 sleep 88
root       2180  0.0  0.0 112808   968 pts/0    R+   09:44   0:00 grep --color=auto sleep
[root@lichengbo-nb ~]# 
[root@lichengbo-nb ~]# 
[root@lichengbo-nb ~]# bg            #后台运行 
[1]+ sleep 88 &
[root@lichengbo-nb ~]# ps aux |grep sleep 
root       2178  0.0  0.0 108052   352 pts/0    S    09:44   0:00 sleep 88
root       2182  0.0  0.0 112808   968 pts/0    R+   09:44   0:00 grep --color=auto sleep

#bgm  背景音乐  
bg  background 后台 背景

#交互式命令不推荐后台: passwd,vim,top,htop..

bg 后台运行 
fg 回到前台 frontground 前台
3) screen
  • 创建一个窗口,运行指定的命令,(相当于是后台运行)
#01安装
yum install -y screen

#案例 01 让命令/进程通过screen运行 ,命令运行结束自动退出 screen窗口
screen tar zcvf  /tmp/etc.tar.gz  /etc/

#如果执行命令过程中出现连接断开,screen保存.
screen -ls #查看保存会话(窗口)
screen -r 窗口id   #恢复 

#03 案例02  
screen 
for n  in {1..10000}
do
   echo $n
   sleep 1
done

断开窗口
查看
screen -ls
恢复窗口
screen -r 

#补充命令
screen 创建screen窗口
screen -ls #查看窗口
screen -r  #恢复窗口
screen -S 创建窗口的时候指定名字.

手动退出窗口,窗口还会继续运行.
ctrl+a 然后按d
4) nohup + &
  • 效果与使用和 &一致.
区别
& 后台运行 运行后台命令如果有输出,输出到屏幕上.
nohup + & 后台运行 运行后台命令如果有输出,写入到一个文件中默认是nohup.out
5)任务管理
  • fg,bg
  • jobs 查看当前通过&、ctrl+z 进入后台运行,挂起进程

3. 进程管理-杀手三人组

3.1 概述

命令 特点 区别
kill 结束进程 根据进程pid结束进程
pkill 结束进程 根据进程名结束进程(过滤,模糊匹配)
killall 结束进程 进程名字结束进程

3.2 应用

1)kill
#01 kill 
[root@lichengbo-nb ~]# ps aux    |grep sleep  
root       3825  0.0  0.0 108052   356 pts/0    S    10:40   0:00 sleep 999
root       3843  0.0  0.0 108052   352 pts/0    S    10:40   0:00 sleep 999
root       4141  0.0  0.0 108052   356 pts/2    S+   10:45   0:00 sleep 1
root       4143  0.0  0.0 112808   968 pts/0    R+   10:45   0:00 grep --color=auto sleep
[root@lichengbo-nb ~]# kill  3825
[root@lichengbo-nb ~]# kill  3825
-bash: kill: (3825) - No such process
[2]-  Terminated              sleep 999
[root@lichengbo-nb ~]# ps aux    |grep sleep  
root       3843  0.0  0.0 108052   352 pts/0    S    10:40   0:00 sleep 999
root       4562  0.0  0.0 108052   356 pts/2    S+   10:46   0:00 sleep 1
root       4564  0.0  0.0 112808   968 pts/0    S+   10:46   0:00 grep --color=auto sleep

#02 kill 强制删除,谨慎使用.

kill -9   进程pid
-9 是kill命令信号 
-15 是默认信息 关闭.
2)pkill
#根据进程名字结束进程
[root@lichengbo-nb ~]# ps aux |grep sleep
root       2314  0.0  0.0 108052   356 pts/0    S    01:59   0:00 sleep 999
root       2315  0.0  0.0 108052   352 pts/0    S    01:59   0:00 sleep 99
root       2319  0.0  0.0 108052   352 pts/0    S    01:59   0:00 sleep 9
root       2321  0.0  0.0 112808   968 pts/0    S+   01:59   0:00 grep --color=auto sleep
[root@lichengbo-nb ~]# pkill sleep
[root@lichengbo-nb ~]# ps aux |grep sleep
root       2324  0.0  0.0 112808   964 pts/0    S+   02:00   0:00 grep --color=auto sleep

#使用需要慎重
#尽可能多写点进程的名字及信息
#如果写的进程信息比较少,可能会误杀


pkill -f sleep.sh  #-f根据进程命令,选项,参数,进行过滤与删除

#pkill  sleep
执行过程
1. ps -ef |grep sleep
2. 进程中以sleep开头命令
3. 交给pkill结束

3)killall
精确匹配进程名字。(命令部分)
不会误杀

3.3 应用场景

命令 特点 区别 应用场景
kill 结束进程 根据进程pid结束进程 大部分时候推荐使用kill,防止误杀
pkill 结束进程 根据进程名结束进程(过滤,模糊匹配) 用于批量结束包含指定名字进程(模糊过滤)
killall 结束进程 进程名字结束进程 用于批量结束包含指定名字进程(精确过滤)
#慎用. 批量结束指定进程  
ps aux |grep sleep |awk '{print $2}'  |xargs  kill

4. 系统管理体系-平均负载

4.1 平均负载概述

  • 负载:衡量系统繁忙程度指标,用于初步判断系统运行情况。
  • 平均数(平均负载)
[root@lichengbo-nb ~]# uptime
 23:11:25 up 4 min,  1 user,  load average:    0.02,     0.10,       0.05
                                 平均负载     最近一分钟   最近五分钟   最近10分钟
                                 
#我们一级比较熟悉前面几列,它们分别是当前时间、系统运行时间以及正在登录用户数
#而最后三个数值呢,依次则是过去一分钟、五分钟、十五分钟的平均负载(Load Average)

4.2 衡量系统负载高低(结论)

  • 系统负载数值与当前系统的CPU核心总数对比,越接近CUP核心总数,负载越高,接近于CPU核心总数70%-80%
  • 查看CPU核心总数:lscpu top按1
lscpu

4.3 系统负载背后原理

那到底如何理解平均负载:平均负载是指单位时间内,系统处于可运行状态(R,S)和不可中断状态(D)的平均进程数,也就是平均活跃进程数

可运行状态(R,S):需要消耗CPU资源

不可中断状态(D):需要消耗IO资源

PS:平均负载与CPU使用率并没有直接关系

4.4 系统负载高原因

0)模拟使用的命令stress
  • 对系统进行压力测试,用来测试CPU,mem,磁盘
yum install -y stress #安装

Example: stress --cpu 8 --io 4 --vm 2 --vm-bytes 128M --timeout 10s
--cpu测试CPU
--io测试io读写
--vm测试内存     --vm-bytes 128M 内存读写占用多少内存空间
--timeout 10s  测试时间持续10秒
1)模拟CPU使用率高导致系统负载高
stress --cpu 2 --timeout 9999


top - 23:58:52 up 51 min,  2 users,  load average: 1.94, 1.17, 0.53
Tasks: 124 total,   3 running, 121 sleeping,   0 stopped,   0 zombie
%Cpu(s): 99.8 us,  0.2 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  4026156 total,  3489064 free,   246740 used,   290352 buff/cache
KiB Swap:  2097148 total,  2097148 free,        0 used.  3551148 avail Mem 
Change delay from 3.0 to 
   PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                    
  1746 root      20   0    7312     96      0 R  99.7  0.0   2:43.99 stress                                                                     
  1747 root      20   0    7312     96      0 R  99.7  0.0   2:43.99 stress 
  
  #CPU导致的系统负载高
2)模拟io使用率高导致系统负载高
stress  --hdd 2 --hdd-bytes 2g


#运行一段时间后 查看top命令 wa(iowait )
 [root@oldboy81-golden-lnb ~]# top -b -n1   
top - 12:03:59 up  3:20,  4 users, load average: 3.84, 2.38, 1.27
Tasks: 118 total,   2 running, 116 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us, 14.3 sy,  0.0 ni,  0.0 id, 78.6 wa,  0.0 hi,  7.1 si,  0.0 st
KiB Mem :  2027868 total,    69700 free,   222520 used,  1735648 buff/cache
KiB Swap:  2097148 total,  2097148 free,        0 used.  1629328 avail Mem 
   PID USER     PR NI   VIRT   RES   SHR S %CPU %MEM     TIME+ COMMAND
   287 root      20   0       0      0      0 D  6.7  0.0   0:09.17 kworker/u256:2
  5282 root      20   0    8212   1128     32 D  6.7  0.1   0:15.76 stress
  5283 root      20   0    8212   1128     32 D  6.7  0.1   0:15.61 stress
#磁盘io读写导致系统负载高.

4.5 系统负载高排查流程

1)排查思路概述:
  • 思路/流程:

    ​ 1️⃣发现Linux系统负载高。(未来通过监控软件得知)现在通过top uptime w命令查看

    ​ 2️⃣分析什么原因导致:

    ​ ?️CUP导致

    ​ ?️磁盘io导致

    ​ 3️⃣根据具体原因让后解决

  • 当前目标:通过top命令及信息触笔判断是CPU还是磁盘导致的负载高即可。

2) 超级详细流程

核心掌握前面2个步骤,如果可以可以掌握前3步骤

  • top命令检查CPU还是io导致的负载高

⚠️vmstat 辅助排查系统负载高命令

#分析室CPU还是io导致的负载高
vmstat

[root@lichengbo-nb ~]# vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 1  0      0 3516628   2124 268636    0    0    68     3   40   66  0  0 100  0  0
[root@lichengbo-nb ~]# vmstat 1   #每一秒执行一次
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 1  0      0 3516876   2124 268672    0    0    67     3   40   66  0  0 100  0  0
 0  0      0 3516852   2124 268672    0    0     0     0   55   92  0  0 100  0  0
 1  0      0 3516852   2124 268672    0    0     0     0   42   72  0  0 100  0  0
 0  0      0 3516852   2124 268672    0    0     0     0   44   78  0  0 100  0  0
 1  0      0 3516852   2124 268672    0    0     0     0   41   68  0  0 100  0  0
 0  0      0 3516852   2124 268672    0    0     0     0   44   75  0  0 100  0  0
 0  0      0 3516852   2124 268672    0    0     0     0   52   84  0  0 100  0  0
 0  0      0 3516852   2124 268672    0    0     0     0   43   75  0  0 100  0  0
 1  0      0 3516852   2124 268672    0    0     0     0   51   87  0  0 100  0  0
 2  0      0 3516852   2124 268672    0    0     0     0   40   69  0  0 100  0  0
 0  0      0 3516852   2124 268672    0    0     0     0   58   91  0  0 100  0  0
 0  0      0 3516852   2124 268672    0    0     0     0   41   71  0  0 100  0  0
 0  0      0 3516852   2124 268672    0    0     0     0   46   79  0  0 100  0  0
 0  0      0 3516852   2124 268672    0    0     0     0   46   77  0  0 100  0  0
[root@lichengbo-nb ~]# vmstat 1 10    #每一秒执行一次一共执行10次
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 1  0      0 3516876   2124 268672    0    0    67     3   40   66  0  0 100  0  0
 1  0      0 3516852   2124 268672    0    0     0     0   55   89  0  0 100  0  0
 0  0      0 3516852   2124 268672    0    0     0    25   66  101  0  0 100  0  0
 0  0      0 3516852   2124 268672    0    0     0     0   47   75  0  0 100  0  0
 0  0      0 3516852   2124 268672    0    0     0     0   43   76  0  0 100  0  0
 1  0      0 3516852   2124 268672    0    0     0     0   43   74  0  0 100  0  0
 0  0      0 3516852   2124 268672    0    0     0     0   43   77  0  0 100  0  0
 1  0      0 3516852   2124 268672    0    0     0     0   46   74  0  0 100  0  0
 0  0      0 3516852   2124 268672    0    0     0     0   43   79  0  0 100  0  0
 0  0      0 3516852   2124 268672    0    0     0     0   44   81  0  0 100  0  0


#vmstat中第一列 r和第二列 d 表示什么
 r: The number of runnable processes (running or waiting for run time).
    #当前可以运行的进程数量(正在运行用或准备要运行)类似于进程状态R
       
 b: Number of processes blocked waiting for I/O to complete.
    #正在进行IO进程(不可中断进程)

#rb与负载高关系(参考)
r数量高:很可能是CPU占用导致系统负载高
b数量高:很可是是IO占用导致系统负载高

5. 系统管理体系-服务管理

  • 目标:
    • 熟练使用systemctl命令 开/关/重启服务,开机自启动/关闭开机自启动某个服务
    • Linux运行基本(target/runlevel)
    • Linux启动流程

5.1 系统服务管理ststemctl

  • systemctl (system control)系统控制命令,c7(红帽7系列)
1)服务启动/关闭/重启

建议:使用这个命令前,安装系统自动补全增强工具

需要配置epel源才能安装

bash-completion bash-completion-extras

yum install -y    tree   vim wget  bash-completion  bash-completion-extras  lrzsz  net-tools sysstat  iotop iftop htop unzip nc nmap telnet bc  psmisc httpd-tools  bind-utils nethogs expect
  • 使用
#案例01 开启服务/关闭/重启
systemctl stop network      #关闭
systemctl start network     #开启
systemctl restart network   #重启

常用服务:network网络服务器 sshd远程连接服务 nginx网站服务 firewalld防火墙服务

2)开机自启动

开机自启动:在Linux开机的时候服务/命令可以自动运行

#案例01 配置服务的开机自启动
systemctl start  firewalld      #
systemctl disable  firewalld    #让防火墙开机关闭


此时此刻:防火墙是否运行? 运行
重启Linux系统后:防火墙是否运行?  关闭


彻底关闭防火墙
systemctl stop  firewalld 
systemctl disable  firewalld
3)检查
staus  #状态 服务的状态

[root@lichengbo-nb ~]# systemctl status firewalld.service 
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
   Active: active (running) since Thu 2022-03-24 15:44:24 CST; 27s ago
     Docs: man:firewalld(1)
 Main PID: 1123 (firewalld)
   CGroup: /system.slice/firewalld.service
           └─1123 /usr/bin/python2 -Es /usr/sbin/firewalld --nofork --nopid

Mar 24 15:44:22 oldboy81-golden-lnb systemd[1]: Starting firewalld - dynamic firewall daemon...
Mar 24 15:44:24 oldboy81-golden-lnb systemd[1]: Started firewalld - dynamic firewall daemon.
Mar 24 15:44:24 oldboy81-golden-lnb firewalld[1123]: WARNING: AllowZoneDrifting is enabled. This is considered an insecure configur...t now.
Hint: Some lines were ellipsized, use -l to show in full.


systemctl stop firewalld.service 
systemctl disable firewalld.service
4)小结
服务管理指令
开关重启服务 systemctl start/stop/restart 服务名字
服务卡机自启动控制 systemctl enable/disable 服务名字
检查 systemctl status 服务名字
检查某个服务是否运行:crond
systemctl is-active crond

检查某个服务是否开机自启动:crond
systemctl is-enabled crond

6. 运行级别

6.1 概述

  • 运行级别:(runlevel/target)Linux系统的不同状态。 (命令行模式(状态),图像化界面模式(状态))

6.2 详解

运行级别(CenttOS 6.x) C7
0 poweroff 关机
1 rescue(救援) 单用户模式,救援模式。(root密码忘记了或Linux无法启动时使用)
2 multi-user C6:无网络的单用户模式(NFS)
C7:文本模式,命令行模式,多用户模式
3 multi-user(多用户) 命令行模式,文本模式(工作必备,工作默认),多用户模式
4 multi-user C6:未使用
C7:与2,3一样,多用户模式
5 graphical 图像化界面模式,桌面模式,X11(需要安装对应环境) 如果想尝试请使用Ubuntu
6 reboot 重启

6.3 修改

#01 查看当前系统运行级别
[root@lichengbo-nb ~]# systemctl get-default 
multi-user.target

#02 修改运行级别
[root@lichengbo-nb ~]# systemctl set-default  graphical.target 
Removed symlink /etc/systemd/system/default.target.
Created symlink from /etc/systemd/system/default.target to /usr/lib/systemd/system/graphical.target.
[root@lichengbo-nb ~]# systemctl get-default 
graphical.target

7. Linux启动流程

7.1 概述

  • 面试题:必备面试题

7.2 详细流程

  • 按下开关后一直到欢迎界面结束过程。

1️⃣开机自检(BIOS自检)

2️⃣MBR/GPT引导系统启动

3️⃣GRUB菜单(选择内核,进入救援模式)

4️⃣加载内核镜像(加载/boot下内容到内存中)

5️⃣运行第一个进程:systemd

6️⃣读取运行级别:多用户模式即可。

7️⃣系统初始化:IP ,主机名,fstab挂载。

8️⃣启动服务(并行)

9️⃣显示登录界面(getty 运行login界面)

8. 如何找回root密码

8.1 运维plan b(备用方案)

  • 配置普通用户,给普通用户设置sudo权限
  • 存放密码工具:keepass
  • 未来:配置密钥认证

8.2 处理流程

  • 重新设置root密码需要重启服务器。(可能影响用户)
  • 详细流程:重启服务器后进入grub菜单进行操作
a)方法一 本地救援模式(单用户模式)
  • 如何修改

1️⃣

2️⃣

进入到Linux命令行(无法使用远程连接)
默认是root用户(不需要输入密码)
passwd #使用passwd修改密码即可
删除passwd命令锁文件
rm -f /etc/.pwd.lock
重启即可

或者直接修改passwd文件
vim /etc/passwd  #通过vim修改文件,删除root的x部分 root就没有密码

b)方法二 通过光盘启动系统
  • 通过光盘或U盘启动Linux系统

1️⃣光盘,U盘是否插入系统

2️⃣通过光盘,U盘启动系统

logo页面迅速按esc,选择光盘启动

选择 troubleshooting

选地一个或第三个

如何操作硬盘的系统数据, 执行chroot /mnt/sysimage 就可以直接操作系统磁盘的数据,目录结构一致

3️⃣重新设置密码或清空root密码

4️⃣退出:crtl+d 按2次