八、系统管理体系
系统管理体系
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次
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人