kaixin
Published on 2023-08-06 / 35 Visits
1

Linux服务资源

Linux定时功能

作用:

  • 周期性任务,后台运行,到了预定的时间就会自动执行的任务,前提是:事先手动将计划任务设定好。
  • 比如:每天9点开会,12点吃中午饭。半夜对公司的数据库进行备份,或者是重启一下服务等等操作。

场景:

  1. mysql,redis数据库进行数据备份。
  2. 定时获取服务器的状态(cpu,内存,磁盘,网络)。
  3. 定时进行数据同步。
  4. 网站日志定时切割,备份。

注意:

  • cron服务最低检测限制是分钟。
  • 周日月不能同时使用。

1.命令使用

命令:
    crontab

参数:
    -l 列出当前机器的计划任务
    -e 进入编辑状态,可以添加或者修改计划任务
    -u 指定用户,如果不指定用户那么默认就是当前用户
    -r 清空计划任务

配置文件:
    /etc/crontab

语法:
    *(分) *(时) *(日) *(月) *(周) 命令的绝对路径 脚本的绝对路径

计划任务文件:
    # 每个用户都有一个crontab文件。存储到/var/spool/cron/下面,按照用户名区分。
    /var/spool/cron/用户名称 # 按照用户名进行区分的。
    
    # 注意:
        /var/spool/cron/ 在这个文件夹下,只有用户写入了计划任务才会创建针对用户的文件。

操作:
    1.打开
        crontab -e 或者 在/var/spool/cron/目录下打开
        
    2.写入计划任务,保存即可
        0 0 * * *  /bin/bash xx.sh

1-1.参数说明

1.-e参数
    crontab -e # 编辑当前登录用户的计划任务

2.-l参数
    crontab -l # 查看当前登录用户的计划任务

3.-r参数
    crontab -r # 清空当前登录用户的计划任务

4.-u参数
    crontab -u wkx -e # 编辑wkx用户的计划任务
    crontab -u wkx -l # 查看wkx用户的计划任务
    crontab -u wkx -r # 清空wkx用户的计划任务

1-2.服务查看

服务的名称:
    crond

1.查看服务
    systemctl status crond

2.启动或者停止或者重启
    systemctl stop crond
    systemctl restart crond
    systemctl start crond

2.相关配置文件

2-1.每个*代表含义

代表含义 分钟(第一个*) 小时(第二个*) 日期(第三个*) 月份日期(第四个*) 周(第五个*)
数据范围 0-59 0-23 1-31 1-12 0-6 或者1-7(0与7代表周日)

2-2.特殊字符

特殊字符 代表含义
*(星号) 范围内的每个值都会接受。比如:* * * * * 就代表无论月份还是天数还是任何礼拜,每一分钟都会执行。
,(逗号) 间隔的意思。比如:15,25 * * * *代表每天的每个小时15分中与25分钟执行。
-(减号) 区间范围的意思。比如:12-22 * * * *代表每天的每个小时12,13,14,15,16,17,18,19,20,21,22分钟执行。
/n(斜杠) 频率的意思。n代表数字及每n个单位进行间隔。*/5 * * * *代表每天的每个小时每5分钟执行一次。

3-4.配置文件

/etc/crontab 文件内容如下:

SHELL=/bin/bash # 定时任务是使用了bash解释器,需要使用bash解释器
PATH=/sbin:/bin:/usr/sbin:/usr/bin # crontab自己定了path环境变量,注意写在定时器中得任务必须是绝对路径,不容易出错
MAILTO=root # 定时任务执行后,会给系统用户发送邮件

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name  command to be executed



*  *  *  *  * 具体有什么含义:
    第一个*: (分:0 - 59) # 0 - 59分钟 0代表整点也就是60分钟的意思
    第二个*: (时:0 - 23 区分上午下午) # 0点 - 23点
    第三个*: (日:1 - 31) # 1-31号
    第四个*: (月:1 - 12) # 1-12月
    第五个*: (周0-6(0或者7代表周日)) # 0-6 代表的是周几 0代表周日 7代表周日
     
4个特殊符号:
    *:代表范围值的每一个值。如果在第一个位置的*就代表分钟,每一分钟都会执行
    -:代表连续区间。1-7就代表1 2 3 4 5 6 7
    /:代表频率,如果每10分钟执行一次就是 */10(每隔10分钟执行一次),如果第三个10分钟执行一次 */10(1小时的第三个10分钟执行)
    ,:代表间隔,如果想要1号5号10号执行就是 1,5,10
    L:

# 注意:
    使用 / 频率必须是可以被整除的才可以。

image-20241120221126647


3-4.在配置文件最后写定时任务

语法:
    *  *  *  *  *  执行者身份  执行命令
    # 注意:
        执行者身份需要有对脚本或者写入文件的权限,不然无法执行。
例如:
    在配置文件中(/etc/crontab)写入
    * * * * * wkx /usr/bin/echo "wkx" >> /opt/123.log

3.命令参考写法

1.每天的12点执行
    0 12 * * * /bin/bash xx.sh
        0:代表整点
        12:代表12点

    如果是:* 12 * * *,就变成每天的12点的每一分钟都会执行,也就是12-1点这60分钟每一分钟都会执行一次脚本
    
2.每分钟执行一次
    * * * * *  /bin/bash xx.sh # 根据特殊符号*代表就范围都会触发脚本
    
3.每月的1 10 22日 的 4:45 执行脚本
    45 4 1,10,22 * *  /bin/bash xx.sh
        45:代表45分
        4:代表4点
        1,10,22:代表1号10号22号 # 通过,进行隔开
        
4.每周6周日1:10执行脚本
    10 1 * * 6,7 /bin/bash xx.sh
        10:代表10分
        1:代表1点
        6,7:周六周日

5.每天 18:00 至 23:00 之前,每隔30分钟执行一次
    */30 18-23 * * * /bin/bash xx.sh
        */30:代表间隔每30分钟
        18-23:代表小时也就是 18,19,20,21,22,23

6.每隔2天的上午8点至11点的第3分钟与第15分钟执行
    3,15 8-11 */2 * * /bin/bash xx.sh
        3,15:代表第3分钟与第15分钟
        8-11:代表8,9,10,11 点
        */2:每2天
        
7.每天凌晨执行
    0 0 * * * /bin/bash xx.sh
        0:代表整点也就是第60分钟
        0:代表的是24点,也就是0点

8.每周4的凌晨2点15分执行
    15 2 * * 4 /bin/bash xx.sh
        15:代表15分
        2:代表2点
        4:代表周4

9.工作日内每个小时执行一次
    0 9-18 * * 1-5 /bin/bash xx.sh
        0:代表整点
        9-18:上班时间9-18点,每个小时
        1-5:周1至周5

30  */6 * * *  # 每6个小时30分钟执行

30 8-18/2 * * * # 8-12点中每2个小时30分钟执行脚本

45 4 1,10 * * #  1号与10号的4:45分执行脚本

10 1  * * 6,0 # 每周的1-7的1:10执行脚本

0,30 18-23 * * * # 每天的18-23的整点与半点执行脚本

0 */1 * * * # 每个小时整点执行脚本

0 11 * 4 1-3 # 4月每周1-周3的11点整执行脚本

0 07-11/2 * * * # 7-11的每两个小时整点执行脚本

0 6 * * * # 每天的6点整执行脚本

4.命令权限扩展

crontab可以通过黑名单与白名单设置,控制用户能否使用crontab

1.黑名单
    作用:
        添加到黑名单的用户无法使用crontab
        
    黑名单配置文件路径:
        /etc/cron.deny
        
    操作:
        # 只需要添加用户名即可
        echo "wkx" >> /etc/cron.deny # 将需要添加黑名单的用户名添加cron.deny文件即可
        

2.白名单
    作用:
        让用户可以使用crontab,优先级比黑名单的要高,就算用户在黑名单中,只要添加到白名单也可以使用。
    
    白名单配置文件:
        /etc/cron.allow # 文件可能不存在需要创建
    
    操作:
        # 只需要添加用户名即可
        echo "wkx" >> /etc/cron.allow # 将需要添加白名单的用户名添加cron.deny文件即可

# 注意:
    1.黑名单文件cron.deny优先级低,如果用户名在当前文件中,那么就无法使用crontab定时器功能
    2.白名单文件cron.allow优先级高,所以系统没有创建这个文件,如果用户名在这个文件中就有使用crontab定时器功能,不在的就无法使用
    由于优先级的问题,建议保留一个文件即可。


# 补充:
    定时任务会产生大量的邮件日志所以需要关闭pstfix
        systemctl stop postfix # 停止
        systemctl disable postfix # 关闭开机自起

image-20241120231349612


Linux服务管理

什么是服务:

  • 在Linux系统中,服务是指后台运行的进程,它们为系统或其他程序提供特定的功能。
  • 服务通常在系统启动时自动启动,并在后台运行,等待其他程序的请求来执行特定的任务。服务的概念类似于Windows中的服务(Service),但实现和管理方式有所不同。
  • 服务于端口是对应的,/etc/services 文件中存放就是网络服务映射的端口。

基本理解:

  1. 服务是作为后台进行运行的(crond,postfix等),它们不直接与用户进行交互,而是等待其他的特定程序的请求。
  2. 服务提供了系统的基本功能,比如网络服务(sshftp),文件共享服务(nfxsamba),数据库服务(mysqlredis)。
  3. 服务是可以进行配置的,通常配置文件都在/etc目录下。
  4. 启动和停止可以根据命令进行控制,比如systemctl或者service,不同的发行版是不同的。
  5. 服务之间是存在相应的关系的,一个服务可能需要另一个服务启动后才能使用。
  6. 服务通常使用的是守护进程(daemon),守护进程是一种特殊的进程,通常使用超级管理员启动,可以处理其他程序的请求。
  7. 具有日志记录功能,可以帮助系统管理人员监控服务的状态。
  8. 服务可以配置开机自启,或者崩溃自启,确保服务的稳定性。
  9. Linux提供了多种工具和服务管理框架,如SystemdUpstart和SysVinit,用于管理服务的生命周期。

守护进程是什么:

  1. 简单来说,守护进程就像一个在后台默默工作的服务提供者,它不需要你直接操作,但会根据配置和需求为你提供持续的服务,服务的对象根据服务本身决定,比如,日志服务,web服务,数据库服务。服务本身是在后台运行,可以通过特定的程序或者接口来访问这个服务,达到使用这个服务的目的,例如:crond就需要crontab命令实现定时功能,mysqld就需要使用mysqlClient进行链接访问。
  2. 特殊权限:许多守护进程以超级用户(root)权限运行,因为它们需要访问系统资源或者执行需要高级权限的操作
  3. 日志记录:守护进程会记录日志,以便于监控服务状态和诊断问题。日志文件通常位于/var/log目录下。
  4. 启动方式:在不同的Linux发行版中,守护进程的启动方式可能不同。例如,使用Systemd的系统可以通过/etc/systemd/system/目录下的配置文件来管理守护进程的启动。

image-20241121222127525

简单理解守护进程:

  • 就是一个服务进程在后台稳定运行,守护进程是Linux系统中服务管理的核心概念,它们确保了系统服务的连续性和可靠性。

简单理解服务:

  • 是一个在后台稳定运行,为用户或者系统内其他服务提供服务的一款程序(数据库服务,打印机服务等等),端口就至关重要,因为它是服务门牌号,只有知道某个服务的端口(门牌号)是什么才能访问,但是还需要知道这个服务是什么协议[应用层协议](http,https,sftp,ssh),知道应用层协议还是不行,还需要知道传输层协议是tcp还是udp传输(大多数服务默认使用特定的传输层协议)。

1.服务管理框架

1-1.Sysvinit

SysVinit是传统的Linux系统初始化和管理系统服务的方法,它基于System V和BSD风格的初始化系统
它使用init进程作为系统的第一个进程(PID 1),并根据/etc/init.d/文件中的配置来启动和停止服务
SysVinit使用运行级别(runlevels)来控制服务的启动和停止。不同的运行级别对应不同的系统状态,如单用户模式、多用户模式、图形界面等。

脚本目录:
    /etc/init.d/
    /etc/rc.d/init.d/

文件一般都是一些shell可执行脚本

1-2.Upstart

Upstart是由Ubuntu开发的一个事件驱动的系统初始化和任务管理框架。
它旨在解决SysVinit的一些限制,如并行启动服务和更灵活的依赖管理。
Upstart使用init进程作为PID 1,并通过.conf文件来定义服务的启动和停止行为,这些文件通常位于/etc/init/目录下。
Upstart支持事件触发和更细粒度的控制,允许服务在特定事件发生时启动或停止。

脚本目录:
    /etc/init/

文件一般为.conf结尾

1-3.Systemd

Systemd是一个现代的系统初始化和管理框架,它旨在替代SysVinit和Upstart。
Systemd使用systemd作为PID 1,它提供了一种统一的方式来管理系统服务、设备、挂载点、套接字、定时器等。
Systemd使用.service文件来定义服务的行为,这些文件通常位于/lib/systemd/system/和/etc/systemd/system/目录下。
Systemd支持并行启动服务,减少了系统启动时间,并提供了强大的依赖管理和日志聚合功能。
Systemd还引入了cgroups(控制组)来更好地管理系统资源。

脚本目录:
    /lib/systemd/system/ # Systemd的单元文件(unit files),用于定义服务、设备、挂载点、套接字、定时器等的行为。
    /etc/systemd/system/ # Systemd的单元文件(unit files),用于定义服务、设备、挂载点、套接字、定时器等的行为。
    /usr/lib/systemd/system/ # 这个目录包含了系统默认的Systemd单元文件,通常由软件包管理器安装。
    /run/systemd/system/ #这个目录用于存放Systemd在运行时生成的单元文件,这些文件可能会被动态修改或生成。存放临时文件

文件一般都是以 .service结尾

# 注意
    对于用户级别的需要将写的system脚本放在:/etc/systemd/system/,如果是其他的用户需要进行sudo提权,文件存在权限限制。

1-4.service命令说明

centos 6 使用的就是基于sysvinit的服务管理框架
centos 7 支持sysvinit和Systemd服务管理框架

service命令说明:
    /ect/init.d/目录下寻找服务脚本。
    service start network # 就是启动 /etc/init.d/network

命令使用:
    service 指令 服务名称

2.管理命令

centos7

命令:
    systemctl 

关键路径:
    service命令管理启动脚本目录:
        /etc/init.d/ # 将执行脚本挡在这个目录下也可以使用 systemctl 命令进行管理 
        /etc/rc.d/init.d/ # 将执行脚本挡在这个目录下也可以使用 systemctl 命令进行管理 
        
     systemctl命令管理启动脚本目录:
         1.这是存放系统服务的主要目录,包含了大多数服务的单元文件
             /usr/lib/systemd/system/
         
         2.由软件包管理器安装的服务单元文件,这些文件是系统级别的服务,由系统管理员或软件包来管理
             /lib/systemd/system/ 
             
        3.这个目录用于存放管理员根据主机系统需求所创建的执行脚本。
            /etc/systemd/system/
            
        4.这个目录用于存放系统执行过程中所产生的服务脚本,这些脚本的优先级比/usr/lib/systemd/system/高。
            /run/systemd/system/
  
命令使用:
    systemctl 指令 服务名称
指令 作用
start 启动
stop 关闭
restart 重启
status 查看服务状态
is-enabled 查看是否开启自启
显示的状态:
1.disable 禁用
2.enable 启用
disable 禁止开机自启
enable 开启开机自启
list-units 显示已经加载到内存中systemd单元
list-unit-files 查看所有已安装服务
daemon-reload 重新载入systemd,扫描新的或者变动的单元脚本,
如果新脚本添加到/etc/systemd/system/文件下,需要执行这个命令重新加载一下。
在什么条件下需要使用:
1.当修改了现有的systemd脚本。
2.添加了新的systemd脚本。
3.删除了systemd脚本。
is-active 检查服务是否正常运行。
显示的状态:
1.active 正常
2.unknown 未知
cat 查看systrem服务的脚本文件内容。

3.脚本编写

3-1.区块说明

脚本的区块分为:
    1.[Unit] 区块:定义依赖和启动顺序
    2.[Service] 区块:定义服务的具体参数和行为
    3.[Install] 区块:定义服务的安装信息,服务如何被加入系统启动过程中

image-20241124214144416


3-2.[Unit] 区块参数

[Unit] 
    Description=xxx  # 描述作用,说明当前服务的具体作用
    After=xxx # 指定服务启动的顺序,表示当前服务需要在列出的服务 "之后" 启动。
    Before=xxx # 指定服务启动的顺序,当前服务需要在列出的服务 "之前" 启动
    Documentation=xxx # 指定服务文档位置在哪里。
    Wants=xxx # 弱依赖关系,如果列出的服务没有启动,当前服务仍会启动,但可能会不正常工作
    Requires=xxx # 强依赖关系,列出的服务未启动,当前服务不会启动

# 例如:httpd服务 [Unit] 块
    [Unit]
    Description=The Apache HTTP Server # 描述是一个http服务器
    After=network.target remote-fs.target nss-lookup.target # httpd服务在启动前,列出的服务必须先启动
    Documentation=man:httpd(8) # 文档使用 man命令可以查看
    Documentation=man:apachectl(8) # 文档使用 man命令可以查看
    
# After参数说明:
    指定的都是网络类的服务,只有它们启动了,才能链接网络。其实可以不用声明这个参数,照样可以启动服务。
    比如:nginx服务或者apache服务,肯定是先需要有网络服务启动后才能启动,它们自己,要不然网络不同,数据也才出不去也进不来。

# 注意:
    Requires参数,是强依赖关系,列出的服务没有启动,那么就无法启动当前服务。
    有些软件需要依赖别的服务启动后才能使用,所以需要这个强依赖关系。比如docker

image-20241124221554063


3-3.[Service] 区块参数

# 这个区块定义了服务的具体运行参数和行为

Type参数:
    作用:定义启动的类型
    
    类型:
        1.simple作用(默认类型):
            当你将服务的 Type 设置为 simple 时,systemd 会认为服务在 ExecStart 指定的命令执行后立即启动,不需要额外的确认,systemd会任务服务启动成功,"不会确认是否真正启动成功"。执行的命令或程序不应该创建子进程,如果创建了子进程,"systemd不会跟踪和管理子进程"。
            
        2.forking作用:
            当你将服务的 Type 设置为 forking 时,主进程会创建一个或者多个子进程,当创建完毕后,主进程等待状态监控子进程状态,systemd就会认为你已经启动成功了。如果服务是传统的守护进程,启动后会创建多个子进程就可以使用,如果不创建子进程那么就不要使用(建议使用simple模式)。
            使用这个模式需要指定PIDFile(记录主进程/子进程pid)参数,systemd来跟踪主进程。
            
        3.oneshot:
            类似于simple,但只执行一次,Systemd 会等它执行完,才启动其他服务
            
        4.dbus:
            类似于simple,但会等待 D-Bus 信号后启动
            
        5.notify:
            与simple类型相似,但是等守护进程准备好后会想systemd发送信号。
        
        6.idle:
            类似于simple,但是要等到其他任务都执行完,才会启动该服务。一种使用场合是为让该服务的输出,不与其他服务的输出相混合
            
ExecStartPre参数:
    作用:在执行 ExecStart 命令前,的准备工作,可以是多个,比如 nginx-t 检查语法。

ExecStart参数:
    作用:定义服务启动时执行的命令或脚本。# 启动

ExecReload参数:
    作用:定义服务重新加载配置文件时执行的命令。# 重启

ExecStop参数:
    作用:定义服务停止时执行的命令或脚本,用于优雅地关闭服务。 # 停止

User参数:
    作用:指定用户
    
Group参数:
    作用:指定服务运行的用户组

TimeoutStopSec参数:
    作用:定义服务器停止超时时间

PIDFile参数:
    作用:指定服务进程id文件路径

TimeoutStartSec参数:
    作用:定义服务器启动的超时时间

EnvironmentFile参数:
    作用:指定一个文件,文件中包含环境变量,文件每一行都是一个环境变量设置

KillMode参数:
    作用:服务停止如何杀死进程的。
    KillMode类型:
        control-group(默认值):当前控制组里面的所有子进程,都会被杀掉。
        process:只杀主进程,由主进程来操作下面的子进程(进行关闭)。
        mixed:这个模式属于control-group + process结合体,先尝试 process 模式进行停止服务,如果主进程没有终止全部的子进程,就会使用 control-group模式 。
        none:不会尝试杀死任何进程。这通常用于服务单元文件只是为了监控另一个由其他守护进程管理的服务的状态。
        
PrivateTmp参数:
    作用:在 systemd 服务单元文件中用于控制服务的临时文件存储行为
    true:启用隔离的临时文件系统,会在/tmp和/var/tmp下创建临时文件夹存放当前服务的内容,关闭后删除。
    false(默认):禁用隔离的 /tmp 和 /var/tmp 文件系统,服务将使用系统全局的临时目录。

KillSignal参数(默认值SIGTERM):
    作用:在 systemd 服务单元文件中的作用是指定当服务需要被停止时,首先发送给服务主进程的信号。		
    类型:
        SIGABRT(信号编号6):异常终止信号,可以被捕获、中断和终止进程。
        SIGALRM(信号编号14):定时报警信号,通常与 alarm() 系统调用关联。
        SIGBUS(信号编号7):表示硬件故障,比如内存访问错误。
        SIGCHLD(信号编号17):子进程结束或停止时发送给父进程的信号。
        SIGCONT(信号编号18):继续执行信号,用于将一个停止(stopped)状态的进程变为运行(running)状态。
        SIGFPE(信号编号8):浮点异常信号,比如非法操作。
        SIGHUP(信号编号1):挂起信号,通常用于重启服务。
        SIGILL(信号编号4):非法指令信号,比如非法的程序行为。
        SIGINT(信号编号2):中断信号,通常由 Ctrl+C 产生。
        SIGKILL(信号编号9):杀死信号,不能被捕获、阻塞或忽略,用于立即结束进程。
        SIGPIPE(信号编号13):管道破裂信号,当写入一个没有读进程的管道时发送。
        SIGQUIT(信号编号3):退出信号,通常由 Ctrl+\ 产生,可以产生核心转储(core dump)。
        SIGSEGV(信号编号11):段错误信号,比如无效的内存引用。
        SIGSTOP(信号编号19):停止信号,使进程进入停止状态,不能被忽略或捕获。
        SIGTERM(信号编号15):终止信号,请求进程自行终止,可以被捕获或忽略,是 kill 命令的默认信号。
        SIGTSTP(信号编号20):停止信号,通常由 Ctrl+Z 产生,使前台进程组停止。
        SIGTTIN(信号编号21):后台进程试图从终端读数据时发送。
        SIGTTOU(信号编号22):后台进程试图向终端写数据时发送。
        SIGUSR1 和 SIGUSR2(信号编号10和12):用户自定义信号,可以由用户指定特定的处理。
        SIGWINCH(信号编号28):窗口大小改变信号,通常由终端窗口大小改变时发送。
        SIGXCPU 和 SIGXFSZ(信号编号24和25):超过CPU时间限制和文件大小限制信号。

# 注意:
    KillMode和KillSignal参数不存在冲突问题。
    KillSignal 用于服务停止过程的开始阶段,主要针对主进程。
    KillMode 用于处理服务停止过程的后续阶段,针对整个控制组,主进程与子进程。
    这两个参数一起使用时,KillSignal 指定了首先发送的信号,而 KillMode 定义了在服务没有响应 KillSignal 后,如何进一步处理进程的终止。例如,如果 KillMode 设置为 control-group,那么在发送 KillSignal 后,如果服务没有停止,systemd 会发送 SIGKILL 信号来强制终止整个控制组内的所有进程。如果 KillMode 设置为 mixed,则会先向主进程发送 KillSignal 指定的信号,然后向控制组内的所有其他进程发送 SIGKILL 信号。


# 例如:httpd服务 [Service] 块:
    [Service]
    Type=notify
    EnvironmentFile=/etc/sysconfig/httpd # 需要使用变量的文件,会被ExecStart,ExecReload,ExecStop等命令执行前被读取和设置
    ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND # 启动
    ExecReload=/usr/sbin/httpd $OPTIONS -k graceful # 重启
    ExecStop=/bin/kill -WINCH ${MAINPID} # 停止
    KillSignal=SIGCONT # 停止终止进程发送信号
    PrivateTmp=true # 启动临时文件隔离 为服务创建独立的 /tmp 和 /var/tmp 目录,这些目录在服务重启时会被清空。

image-20241124232450138


3-4.[Install] 区块参数

# 用于定义安装信息,即如何将服务集成到系统启动过程中

WantedBy参数:
    作用:
        服务在系统启动时是否应该被自动启动。
    multi-user.target:多用户目标,适用于文本模式的服务器环境
    graphical.target:图形界面目标,适用于需要图形界面的系统

3-5.Systemd脚本

vim /usr/lib/systemd/system/nginx2.service

[Unit]
Description=一个nginx的启动脚本
After=network.target remote-fs.target nss-lookup.target # 使用其他脚本的默认的即可
Documentation=使用 nginx -h 查看

[Service]
Type=forking
ExecStartPre=/usr/sbin/nginx -t # 在执行启动前执行脚本检测
ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf # 启动后命令
ExecReload=/usr/sbin/nginx -s reload # 重启
ExecStop=/usr/sbin/nginx -s stop # 终止
PrivateTmp=true # 临时文件隔离
TimeoutStopSec=5 # 停止超时 5秒
TimeoutStartSec=5 # 启动超时时间 5秒

[Install]
WantedBy=multi-user.target


# 注意:使用命令自带的终止方式要比systemd服务参数终止要好一些
    # 自带命令终止
        ExecStop=/usr/sbin/nginx -s stop 
    # systemd参数终止
        KillSignal=SIGQUIT
        KillMode=process

image-20241124235837371


3-6.Sysvinit脚本

# 没有那么多复杂的指令,只需要编写shell脚本设置为可执行权限,然后放到 /etc/init.d/ 即可

#! /bin/bash
nginx=/usr/sbin/nginx
case $1 in
start)
    $nginx -t > /dev/null 2>&1
    if [ $? -eq 0 ];then
        $nginx -c /etc/nginx/nginx.conf
    fi
    ;;
restart)
    $nginx -t  > /dev/null 2>&1
    if [ $? -eq 0 ];then
        if [  -f /run/nginx.pid ];then
            $nginx -s reload
        else
            $nginx -c /etc/nginx/nginx.conf
        fi
    fi
    ;;
stop)
    $nginx -s stop
    ;;
*)
    echo $"Usage: $0 {start|stop|status|restart}"
    ;;
esac

# 注意:
    当脚本移动到 /etc/init.d/ 需要执行systemctl daemon-reload 重新加载一下。
    重新加载后,就会生成一个根据上面的shell脚本生成的 systemd服务脚本。

image-20241125001742476


4.服务

4-1.ssh服务

作用:
    通过ssh协议用户可以远程链接到服务器。

systemctl status sshd  # 查看状态

4-2.postfix服务

作用:
    自带的邮箱服务。正常情况下不会使用自带的邮箱服务建议关闭,开启状态下会产生大量的邮件数据。
systemctl stop postfix && systemctl disable postfix

4-3.network服务

作用
    网卡,网络服务。负责linux服务器的网络服务,如果服务没有启动会导致ssh无法连接,无法与外界通信等网络问题。
    
systemctl status network

查看网络ip的命令:
    ip a
    ifconfig # 需要安装net-tools工具

image-20241125214748389


4-3-1.配置文件

配置文件所在位置:
    /etc/sysconfig/network-scripts

TYPE=Ethernet # 网络类型
PROXY_METHOD=none # 网络接口直接连接网络,而不通过代理服务器
BROWSER_ONLY=no # 这个参数通常用于无线网络配置,表示该网络接口不仅用于浏览器流量,也用于其他类型的网络流量。
BOOTPROTO=dhcp # ip获取方式
DEFROUTE=yes # 启动默认路由
IPV4_FAILURE_FATAL=no # 表示如果IPv4配置失败,不会阻止接口启动。即使IPv4配置失败,接口仍然可以启动并使用IPv6
IPV6INIT=yes # 表示启用IPv6支持
IPV6_AUTOCONF=yes # 允许接口自动配置IPv6地址,通常是通过状态less地址自动配置(SLAAC)
IPV6_DEFROUTE=yes # 表示在接口启动时启用IPv6默认路由
IPV6_FAILURE_FATAL=no # 表示如果IPv6配置失败,不会阻止接口启动。即使IPv6配置失败,接口仍然可以启动并使用IPv4。
IPV6_ADDR_GEN_MODE=stable-privacy # 指定IPv6地址生成模式为“稳定隐私”模式,这种模式生成的地址不会频繁变化,同时保护用户隐私。
NAME=ens33 # 网卡的名称
UUID=eb83e7de-32aa-4300-baa1-122237ac98a5 # 网卡唯一标识
DEVICE=ens33 # 网卡设备名称
ONBOOT=yes # 激活网卡,no不要网络

参数说明:
    BOOTPROTO:
        dhcp:动态自动分配
        static:静态ip,需要手动设置

image-20241125215101386


4-3-2.设置静态网络

# 注意:
    需要先确认网段,和网关

在网卡中修改参数:
    BOOTPROTO="static" # 修改为静态模式
在网卡配置文件中添加参数:
    IPADDR="192.168.116.77"  # 修改静态ip,按照自己的网段设置
    GATEWAY="192.168.116.2" # 设置网关,是你自己的网段的网关
    NETMASK="255.255.255.0" # 设置子网掩码
    dns服务器设置,重启后,就在/etc/resolv.conf配置文件中添加这两个dns地址
    DNS1="114.114.114.114" # dns服务器
    DNS2="115.115.115.115" # dns服务器

4-4.NetworkManager服务

作用:
    网络服务于network一样。但是与network冲突。建议关闭当前服务。

systemctl disable NetworkManager && systemctl stop NetworkManager

# 为什么不使用的原因:
    NetworkManager 和 network 服务不能同时运行的主要原因是它们都负责管理网络接口,而且存在功能重叠。这两个服务在设计上是互斥的,因为它们可能会对网络接口进行冲突的配置,导致网络不稳定或配置错误。

在大多数服务器环境中,建议禁用 NetworkManager 服务,因为它更多地用于桌面环境和需要频繁改变网络设置的场景,而 network 服务则更适合服务器环境,提供更稳定和可控的网络配置。

NetworkManager 适用于桌面版
network 适用于服务器环境

4-5.ntp时间服务

作用:
    ntp是网络时间协议(network time protocol)它是用来同步网路中各个计算机时间协议,在计算机的世界中,时间非常重要。
    ntp就是用来解决这个问题,ntp(网络时间协议)用来计算网络中各个计算机时间同步的一种协议,它的用途是吧计算机的时钟同步到世界协调UTC,其中的精准度在局域网中可达0.1ms,在互联网上绝大多数的地方精准度可达1-50ms。

可以通过网站查看ntp同步时间网址:
    http://ntp.org.cn/pool
    
全世界的服务器,时间统一标准,可以以这个为准:cn.ntp.org.cn

4-5-1.时间同步方式

服务器时间乱了怎么解决?
    1.时间同步,搭建ntpd服务,一点一点的将时间校验的。
    2.时间校准,ntpdate命令,直接调整时间

如果使用ntpdate命令会出现以下问题:
    1.ntpdate的设置依赖于ntp服务器的安全性,攻击者可以利用一些软件设计上的缺陷,拿下ntp服务器并令与其同步的服务器执行某些消耗性的任务
    2.ntpdate是急变,是立即修改系统时间,非常依赖于时序的程序可能会出错,比如根据时间执行备份动作的脚本,或者一些监控程序

4-5-2.ntpdate命令

作用:
    进行时间校准,需要指定ntp服务器地址直接调整时间。

1.安装命令
    yum install -y ntpdate

2.命令与参数:
    ntpdate

3.使用:
    # ntpdate ntp服务器域名
    ntpdate cn.ntp.org.cn

4.crontab进行时间同步
    * * * * * /usr/sbin/ntpdate cn.ntp.org.cn > /dev/null 2>&1

image-20241125222032133


4-5-3.timedatectl命令

作用:
    进行时间修改,直接修改,Linux系统中用于查询和修改系统时间和日期的命令行工具。

命令:
    timedatectl

参数:
    status # 查看状态
    set-time '指定时间' # 设置当前时间
    set-timezone '指定时区' # 设置时区
    list-timezones # 列出当前支持哪些时区
    set-ntp 'off/on' # 开启ntp同步,需要ntp服务端(通过外部ntp进行同步,如果本地部署了ntp服务程序不会冲突)

# 查看 timedatectl状态
[root@shell network-scripts]# timedatectl status
      Local time: Mon 2024-11-25 09:52:02 EST # 本地时间
  Universal time: Mon 2024-11-25 14:52:02 UTC # 世界时间
        RTC time: Mon 2024-11-25 14:52:02 # 通常指的是BIOS或UEFI中的硬件时钟时间,这里显示的是UTC时间
       Time zone: America/New_York (EST, -0500) # 时区
     NTP enabled: yes # 当前链接ntp服务启用状态
NTP synchronized: yes # ntp同步状态
 RTC in local TZ: no # 表示硬件时钟(RTC)没有设置为本地时区时间,而是设置为UTC时间
      DST active: no # 表示当前不处于夏令时(Daylight Saving Time,DST)期间
 Last DST change: DST ended at # 显示了上一次夏令时结束的时间,这里是2024年11月3日
                  Sun 2024-11-03 01:59:59 EDT
                  Sun 2024-11-03 01:00:00 EST
 Next DST change: DST begins (the clock jumps one hour forward) at # 显示了下一次夏令时开始的时间,这里是2025年3月9日,届时时钟将向前调整一小时
                  Sun 2025-03-09 01:59:59 EST
                  Sun 2025-03-09 03:00:00 EDT
 

例如:
    timedatectl set-timezone Asia/Shanghai # 修改上海时区
    修改时间:
        1.需要将ntp同步关闭
            timedatectl set-ntp off
        
        2.设置时间
            timedatectl set-time '2024-11-12 20:00'

image-20241125230106989


4-5-4.ntp服务搭建

作用:
    可以将当前服务器作为一个时间同步的服务器。你的其他服务器就可以直接 "ntpdate 搭建的ip地址" 实现时间同步
    可以作为其他的linux服务器的时间服务器(上游服务器)。比如linux 192.168.31.106服务器作为192.168.31.251服务的上游服务器
    
1.安装ntp
    yum install -y ntp

2.修改配置文件
    /etc/ntp.conf

3.修改内容如下:
    logfile /var/log/ntpd.log # 添加 logfile 变量 设置日志地址
    pidfile /var/run/ntpd.pid # 添加 pidfile 记录ntpd pid脚本
    # 上级时间服务器配置地址
    server times.aliyun.com iburst prefer 
    server ntp.aliyun.com iburst
    server cn.pool.ntp.org iburst
    
    iburst和prefer参数解释:
        iburst:当一个运程NTP服务器不可用时,向它发送一系列的并发包进行检测。
        prefer:表示为优先,表示本机优先同步该服务器时间。
 
 4.启动服务
     systemctl enable ntpd && systemctl start ntpd
 
 # 注意:
     启动的默认端口是:123

image-20241125230905799


4-5-4.ntp服务命令管理

1.确认本地NTP与上层NTP服务器是否联通(是否与上游服务器同步) # 就是配置文件中配置 server 服务器链接状态,是否链接
    命令:
        ntpstat 
    
    使用:
        [root@shell network-scripts]# ntpstat
        synchronised to NTP server (193.182.111.142) at stratum 3 # 说明已经同步
            time correct to within 139 ms
            polling server every 64 s

    注意:
        如果一直处于不同步状态,请修改配置文件,将prefer优先放在别的server
 
 2.查看同步的状态,查看ntpd服务配置的时间服务器server中那个服务链接,断开等详细的服务信息
     命令:
         ntpq
     
     参数:
         -p # 输出同步列表
     
     使用:
         ntpq -p
         
     [root@shell network-scripts]# ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
    ==============================================================================
     120.25.115.20   .INIT.          16 u    -   64    0    0.000    0.000   0.000
    *203.107.6.88    100.107.25.114   2 u   49   64    1   53.447   -0.173   2.760
     a.chl.la        131.188.3.222    2 u   48   64    1  273.843   22.650   4.004

    remote :本地主机所连接的上层NTP服务器,最左边的符号如下:
    如果有[*] 代表目前正在使用当中的上层NTP服务器
    如果有[+] 代表也有连上上层NTP服务器,可以作为提高时间更新的候选NTP服务器
    如果有[-] 代表同步的该NTP服务器被认为是不合格的NTP Server
    如果有[x] 代表同步的外网NTP服务器不可用

    refid :指的是给上层NTP服务器提供时间校对的服务器
    St:上层NTP服务器的级别。
    When: 上一次与上层NTP服务器进行时间校对的时间(单位:s)
    Poll :本地主机与上层NTP服务器进行时间校对的周期(每多少秒校对一次)(单位:s)
    Poll :本地主机与上层NTP服务器进行时间校对的周期(校对的次数)(单位:s)
    delay:网络传输过程当中延迟的时间,单位为 10^(-6) 秒
    offset:时间补偿的结果,单位为10^(-6) 秒
    jitter:Linux 系统时间与 BIOS 硬件时间的差异时间, 单位为 10^(-6) 秒。

4-6.firewall服务

防火墙:
    防范一些网络攻击,有软件防火墙,硬件防火墙之分

作用:
    防火墙很好的进行保护了机器,入侵者必须先穿过防火墙,才能解除到目标计算机

功能:
    防火墙对流经网络信息进行扫描,过滤一些攻击,以免在计算机上被执行,防火墙还可以关闭不经常使用的端口,还能禁止特定端口的流出通信
    还可以禁止来自特殊站点的访问,从而防止来历不明的入侵者的所有通信
    
概念:
    一般有硬件防火墙,软件防火墙
    硬件防火墙:在硬件级别实现防火墙的功能,另一部分基于软件时间,性能高,成本高
    软件防火墙:软件处理逻辑运行通过硬件平台上的防火墙,性能低,成本低

4-6-1.firewall的zones区域

centos7 中默认使用的防火墙是firewalld服务,但是依然使用的iptables,firewalld服务默认关闭。docder容器默认使用的就是iptables


firewall中得zones作用:
    区域概念可以理解为 不同的防火墙测策模板,每一个策略就是一块区域。类似于策略模板一样,用户可以根据需求选择策略


1.firewalld增加了区域的概念

    命令:
        firewall-cmd --list-all-zones # 列出常见区域模板,具体的信息
        firewall-cmd --get-zones # 列出所有的区域模板的名字
        firewall-cmd --get-default-zone # 查看当前使用的区域模板
        firewall-cmd --list-all # 当前使用区域模本的详情信息

    

    # 常见的区域对应的策略
    trusted :允许所有数据包
    home :拒绝流入流量,除非与流出流量相关,允许ssh,mdns,ipp-client,amba-client,dncpv6-client服务通过
    internal :等同于home
    work :拒绝流入流量,除非与流出流量相关,允许ssh,ipp-client,dncpv6-client
    public :拒绝流入流量,除非与流出流量相关,允许ssh,dncpv6-client
    extrnal : 拒绝流入流量,除非与流出流量相关,允许ssh
    dmz :拒绝流入流量,除非与流出流量相关,允许ssh
    block :拒绝流入流量,除非与流出流量相关,非法流量采取拒绝操作
    drop :拒绝流入流量,除非与流出流量相关,非法流量采取丢弃操作
    
2.firewall的模式
    1.运行模式:在当前模式下,配置防火墙策略立即生效,但不写入配置文件。(机器重启后就会失效)
    2.永久模式:在当前模式下,配置防火墙的策略写入配置文件中,需要reload重启
    firewall采用的是运行模式

4-6-2.firewall临时配置

# 使用的命令firewall-cmd
命令:
    firewall-cmd
参数:
    --list-all-zones  # 打印全部策略的详情信息
    --list-all  # 查看当前使用策略的详情信息
    --get-zones # 打印全部的策略名称
    --get-delault-zone # 查看当前使用的策略

    --add-port=端口号/协议 # 让防火墙放开某个端口号,并且指定协议
    --remove-port=端口号/协议 # 移除端口,并且协议
    --add-service=<service> #  让防火墙放开某个服务,通过服务名添加
    --remove-service=<service> #  让防火墙关闭某服务,删除添加的服务

    set-default-zone=<zone> # 设置区域
    --zone=<zone> # 在查询或设置时,对区域进行指定防止,如果不指定就使用默认区域

    --permanent # 设置永久,需要配合其他设置参数一起使用
    --reload # 重载

    --get-service # 查询当前区域规则可以支持的服务名
    --list-service # 查询当前区域下,已经放开的服务名`

3.--add-port参数,添加80端口号

    1.查看当前firewall使用的策略
        20:58 root@linux01 ~ #firewall-cmd --list-all
        public (active)
        target: default
        icmp-block-inversion: no
        interfaces: ens33
        sources: 
        services: dhcpv6-client ssh  # 当前可以通过的服务
        ports:  # 当前放开的端口号
        protocols: 
        masquerade: no
        forward-ports: 
        source-ports: 
        icmp-blocks: 
        rich rules: 

    2.开启一个web服务
        20:58 root@linux01 ~ #systemctl start nginx

    3. --add-port给当前firewall防火墙添加放开80/tcp的策略
        # 放开80端口并且是tcp协议
        21:00 root@linux01 ~ #firewall-cmd --add-port=80/tcp
        success
    
    4.查看
        21:05 root@linux01 ~ #firewall-cmd --list-all
        public (active)
        target: default
        icmp-block-inversion: no
        interfaces: ens33
        sources: 
        services: dhcpv6-client ssh
        ports: 80/tcp  # 当前已经放开了80/tcp
        protocols: 
        masquerade: no
        forward-ports: 
        source-ports: 
        icmp-blocks: 
        rich rules: 


4. --remove-port移除开放端口
    1.设置移除
        21:13 root@linux01 ~ #firewall-cmd --remove-port=80/tcp
        success

    2. 查看移除后的情况
        21:13 root@linux01 ~ #firewall-cmd --list-all
        public (active)
        target: default
        icmp-block-inversion: no
        interfaces: ens33
        sources: 
        services: dhcpv6-client ssh
        ports:  # 端口号已经被移除
        protocols: 
        masquerade: no
        forward-ports: 
        source-ports: 
        icmp-blocks: 
        rich rules: 


5. --add-service通过服务名添加
    1.通过服务名称进行添加
        21:25 root@linux01 data #firewall-cmd --add-service=ntp
        success
        
    2.查看
        21:25 root@linux01 data #firewall-cmd --list-all
        public (active)
        target: default
        icmp-block-inversion: no
        interfaces: ens33
        sources: 
        services: dhcpv6-client ntp ssh # 添加了ntp时间同步服务 
        ports: 80/tcp
        protocols: 
        masquerade: no
        forward-ports: 
        source-ports: 
        icmp-blocks: 
        rich rules: 

6. --remove-service按照服务名移除
    1.进行移除
        21:43 root@linux01 ~ #firewall-cmd --remove-service=ntp
        success
     2.查看
        21:43 root@linux01 ~ #firewall-cmd --list-all
        public (active)
        target: default
        icmp-block-inversion: no
        interfaces: ens33
        sources: 
        services: dhcpv6-client ssh
        ports: 
        protocols: 
        masquerade: no
        forward-ports: 
        source-ports: 
        icmp-blocks: 
        rich rules: 


7.上述的操作就是添加iptables的规则
    iptables -L # 查看当前linux的规则 

# linux关机后立马失效   

4-6-3.firewall永久配置

需要添加一个参数  --permanent [不会立马生效,需要重启firewall服务,重启后设置的内容还存在。]

1.添加一个永久的策略
    21:54 root@linux01 ~ #firewall-cmd --permanent --add-port=80/tcp
    success

2.重启服务
    systemctl restart firewalld

# 注意永久配置删除的情况下需要增加  --permanent 参数
    firewall-cmd  --permanent --remove-port=80/tcp

4-6-4.firewall报错无效服务

22:06 root@linux01 ~ #firewall-cmd --add-service=nginx
Error: INVALID_SERVICE: nginx # 报错无效服务

原因:
    因为firewall中已经将服务名称给规定好了,必须按照firewall提供的服务名称[规定好了],因为nginx是一个web服务需要进行查看http相关的,最简单的方式就是不使用 --add-service 进行设置规则。

1.可以通过,查看支持的服务名称:
    firewall-cmd --get-service

2.在使用 --add-service 进行设置即可。

4-6-5.配置文件

配置文件路径:
    /etc/firewalld/firewall.conf

区域规则配置文件路径:
    /etc/firewalld/zones/public.xml # 默认使用的就是public模块区域规则

    1.如果使用临时的方式设置端口与服务,当前文件就不会变化
        firewall-cmd --add-service=http
    
    2.如果是用--premanent(永久)参数就会使,当前文件配置发生变化
        firewall-cmmd --premanent --add-servoce=http # 重启后服务,删除也需要加--premanent进行删除
        ....
            <service name="ssh"/> # 默认
            <service name="dhcpv6-client"/> # 默认
            <service name="http"/> # 新增
        ...

Linux资源管理

资源是什么:

  • 指系统的各个硬件和计算机资源,它们可以被操作系统,应用程序或者用户进行管理和调度。

有哪些:

  1. 磁盘资源:涉及到磁盘的读写性能。
  2. 内存资源:指计算机的RAM,关注总大小,剩余大小等。
  3. cpu资源:涉及到cpu的计算和调度能力。
  4. 网络资源:网络的吞吐量,连接状态,路由信息等。

windows的资源:

image-20230705221548194

1.内存

/proc/meminfo 目录是linux提供内存使用情况的详细信息文件。

1-1.mem物理内存

主要指定是实际的内存,也就是设备机器实际安装的内存。

1-2.swap交换空间

是一种虚拟内存技术,它允许内存中不常用的数据移动到磁盘中,便于运行的程序释放物理内存空间。只有物理内存空间不足的时,磁盘空间作为临时的内存扩展。

# 注意:
    由于磁盘的读写速度远远低于物理内存,频繁的使用交换空间会使性能下降。

1-3.buff/chahe缓冲区/缓存区

缓冲区/缓存区:
    主要的作用提升写入性能和读取性能,两者都是内核用来优化磁盘I/O操作的重要机制。
    
# 缓冲区:(解决磁盘的写io)
    1.用于即将写入到磁盘的数据,存储区域,这个些数据被称为"脏页",因为被修改过,但是没有写入到磁盘中。
    2.当程序需要写入数据到磁盘时,会将数据先写入缓冲区,由内核决定这些数据什么时候写入磁盘,这个过程被称为"刷新"。
    3.减少磁盘的io次数,提升性能,也就是减少磁盘的写入操作,因为磁盘的写入性能远远不如内存的效率高,将需要写入磁盘的数据暂时存储到缓冲区,再由cpu决定什么时候在写入到磁盘上。

# 缓存区:(解决磁盘的读io)
    1.存储一些频繁使用的数据,方便程序进行读取使用。
    2.主要还是为了减少对磁盘的读io的操作,为了提高"读取"的性能。
    3.内存的效率远远高于磁盘。

# 注意:
    缓冲区与缓存区的使用内存空间不是固定的,而是根据读写磁盘的进行动态变化的。

# 注意2:
    需要注意缓冲区与缓存区在内存中占比过大的问题,需要根据需要进行修改内核参数,调整文件系统选项,定时重启系统

1-4.内存相关命令

1-4-1.free

1.free
    命令:
        free
    参数:
        -k 显示单位KB
        -m 显示单位是M
        -h 以可读取形式显示容量
        -c 重复打印几次后退出。
        -s 每隔多少秒后打印一次,单位是秒。
    [root@shell opt]# free -h
                  total        used        free      shared  buff/cache   available
    Mem:           1.8G        154M        1.2G        9.5M        456M        1.5G
    Swap:          2.0G          0B        2.0G
    
    解释:
        total:总大小
        used:使用大小
        free:剩余大小
        shared:多个进程的内存共享值,这部分的内存是用于进程通信
        buff/chahe:缓冲区/缓存区
        available:预计可使用内存大小,由 剩余大小 + 缓冲区/缓存区 的总和
        
        mem:物理内存
        swap:交换空间

image-20241208210657971


1-4-2.ps

2.ps
    命令:
        ps
    
    参数:
        unix风格,没有短横杠,参数: 与linux查看的有所不同
        a # 显示所有终端,所有执行的进程[包含当前用户]
        u # 显示出进程的操作信息[用户格式显示]
        x # 显示操作系统所有进程信息
        f # 显示进程的属性结构[子进程与父进程的关系树形结构显示]
        o # 格式化进程信息,如 pid[可以指定某些内容展示]
        k # 对进程排序 如 k %mem 正序  k -%mem 倒叙
        --sort  # 在进行排序 如 --sork %mem 根据内存使用率显示
        
    
    # 常用的几种方式
    ps aux # 显示全部进程的信息
    例如:
        ps aux
        
    关注参数:(单位是KB)
        RSS:常驻集内存大小,进程实际使用物理内存,这部分内存被多个进程使用。'这个进程使用的实际内存'
        VSZ:虚拟内存大小,它指的是进程请求的总内存量,包括所有已分配的内存,'这个进程占用的内存(包含实际内存和尚未使用的内存)'
        
# 解释
USER:该进程属于的用户 # 重点
PID:该进程号码 # 重点
%CPU:进程占用CPU的资源比率 # 重点
%MEM:该进程占用物理内存百分比 # 重点
VSZ:进程使用的虚拟内存,单位Kbytes
RSS:该进程占用固定的内存量,单位Kbytes
TTY:该进程运行的终端位置
STAT:进程目前状态,可以man ps查看细节
    R:正在运行中
    S:终端睡眠中,可以被唤醒
    D:不可中断睡眠
    T:进程被暂停
    Z:已停止,无法由父进程正常终止,变成了zombie僵尸进程
        # 进程额外字符
        +:前台进程,比如R+,程序运行在前台,一旦终止,程序结束,数据丢失。
        I:多线程进程,如Sl表示程序是多线程
        N:低优先级进程,如Sn表示优先级很低的进程
        <:高优先级进程
        s:进程领导者(含有子进程),如Ss表示父进程
        L:锁定到内存中
START:进程启动时间
TIME:CPU运行时间
COMMAND:进程命令,名字带有[]表示内核态进程,没有[]表示是用户执行的进程

image-20241208210822597


1-4-3.pidstat

3.pidstat
    命令:
        pidstat 
    
    参数:
        -r 进程的内存情况。
    
    关注参数:
        minflt/s:每秒次缺页错误次数。
        majflt/s:每秒主缺页错误次数。
        VSZ:虚拟内存大小。
        RSS:常驻内存大小。

image-20241208210908247


1-4-4.vmstat

 4.vmstat 
     命令:
         vmstat # 指定数字,代表显示频率
     
     参数:
         -S 指定单位k 、K 、m 、M ,分别代表1000、1024、1000000、1048576字节(byte)。默认单位为K(1024 bytes)
         -s 显示系统的内存使用情况的总结信息
     例如:
         vmstat -S M 1 # 显示单位兆,每秒显示一次
         vmstat 2 # 每2秒显示一次
         
     关注参数:
        swpd:使用的虚拟内存量。
        free:空闲内存量。
        buff:用作缓冲的内存量。
        cache:用作缓存的内存量。

image-20241208210951785


2.进程

进程是什么:

  • 程序放在磁盘中,通过用户执行命令进行触发,触发后就会加载到内存中,成为一个个体,这就是进程。
  • 为了方便操作这个进程,因此进程会给予执行者权限(属性/权限)等参数,并且包含需要的参数,配置文件等数据,最后在给它一个PID,而系统需要通过PID来判断进程是否在工作。

image-20250102222452094

程序与进程的关系:

  • 例如:当用户通过ssh登录到本机后,不通的用户都可以进行登录,而在登录后都是调用这个bash的进程,但是不同点就是用户的权限,当root用户登录后,在bash解释器的操作无论是创建还是修改等,都会沿用root用户的权限,其他用户也是相同的道理。

image-20250102222723203

程序与进程:

  1. 程序:通常是二进制程序放入在媒介中(光盘,磁盘,u盘等),以物理文件存储。
  2. 进程:是程序触发后,执行者的权限属性,程序的代码,相关的资料,都会加载到内存中,操作系统会给于一个PID作为识别符号。进程就是正在运行中的程序。

1号进程(init进程):

  1. 操作系统初始化,init进程是第一个被内核启动的用户空间的进程负责系统初始化。
  2. init进程负责管理系统中的其他进程,包含启动,监控和终止。
  3. 同时会根据系统配置文件来决定系统的运行级别,并且启动对应级别的服务。
  4. 负责管理用户登录会话,包括同行界面会话。
  5. 在系统关闭时,负责关闭其他的服务和进程,执行必要的清理工作。

进程与程序的关系:

  1. 开发将代码写好,打个压缩包,还没有运行时,就是一个静态,程序源代码,程序就是指令与数据的集合.
  2. 当运维人员将服务跑起来,就会成为一个进程(系统中的一个服务)。
  3. 在程序跑起来后,系统为了清晰区别每一个进程,都会分配一个pid,运行用户,内存,cpu等使用情况。

进程线程程序关系图:

image-20241205222028308

/proc/sys/kernel/pid_max # 记录pid号最大可以是多少。

进程的区分:

  1. 在操作系统中常驻内存的进程(守护进程 / Daemon),被成为服务,比如ssh,crontab等。
  2. 在操作系统中执行完毕就会退出的进程,就是用户进程或者普通进程。

2-1.子进程与父进程

子进程与父进程是什么:

  • 例如:当我们ssh登录时会获取一个bash环境,而这个环境就是一个运行中的程序(进程),而在这个进程下操作 touch 123.log 操作就会产生一个衍生的进程,这个进程就是子进程(bash是父进程,衍生进程是子进程)。

image-20250102224112525

2-1-1.查询父子进程1

通过ps命令进行查看。
命令:
    ps

参数:
    -l 采用详细的格式来显示进程状况。

image-20250102224535305


2-1-2.查询父子进程2

命令:
    ps auxf

作用:
    可以通过属性结构形式查看父子进程。

# 父子进程:
    决定了进程资源的分配,权限的继承和进程之间的通信方式。父进程可以操作子进程创建和终止,而子进程会继承父进程的资源和权限。
    可以理解为,子进程(在创建时会复制父进程的资源,生命周期独立于父进程可以在父进程结束前结束,也可以在结束后结束。)是由父进程在某种状态下产生的,作用为了执行某些命令或者其他操作,因为父子进程之间资源是可以共享的,所以子进程可以使用父进程的资源。

# 下图展示了父子进程的关系
    sshd服务 # 父进程
    ↓
    用户root通过sshd服务链接(开启一个ssh远程终端)# 就是sshd的子进程
    ↓
    开启一个bash解释器(主要用于用户与系统交互)# 就是ssh远程中端的子进程
    ↓
    用户执行了一个 ps auxf 命令 # 就是bash解释的子进程

image-20241205222704717

2-2.进程的fork分支的概念

fork-and-exec过程调用:

  • 进程都会通过父进程复制(fork)的方式产生一个一摸一样的字进程,然后这个子进程在以exec的方式执行实际需要执行的程序,最终成为一个子进程存在。
  • 理解:父进程通过fork创建一个与它一摸一样的进程(被称为子进程),然后这个子进程通过exec调用执行子进程应该执行的程序。

fork作用:

  • fork() 是父进程用来创建一个子进程的系统调用。父进程调用 fork() 后,操作系统会创建一个几乎完全相同的子进程。
  • 注意:子进程会获取与父进程几乎相同的资源(内存,文件描述符号),但是它们之间有独立的内存空间,子进程会继承父进程的执行状态,但是父进程与子进程是并行关系。
  • fork()返回值不同,父进程返回的是子进程的pid,而子进程返回的是0。

exec的作用:

  • 让当前进程(无论是父进程还是子进程)加载并执行新的程序。在调用后,当前进程的代码,和数据以及堆栈都会替换为新的程序,当前进程执行开始转向新的程序。

解释图:

image-20250102231600307

# fork作用:
    fork是一种用于创建新进程的系统调用,当fork被调用时,就会创建一个完全一样的副本,这个副本被称为"子进程"。

# 概念
    当linux启动时,用户空间进程是init进程,第一个进程的pid = 1,这个1进程不是由fork启动的,是由内核的启动代码直接调用的。然后由1号进程fork启动其他的进程。
    # 总结来说:操作系统的运行,就是不断的创建进程、以及销毁进程。

image-20230705232037693


2-3.内核进程与用户进程

内核进程:
    1.运行在内核空间的进程,它们操控这系统内核创建和管理。
    2.内核的核心功能:进程管理,内存管理,文件系统管理,设备驱动。
    3.内核进程它们不直接与用户交互,而是为用户进程提供服务。
    4.内核进程拥有最高的权限,可以直接访问系统中的全部资源,包括硬件。
    5.如果内核进程崩溃,那么系统就会出现崩溃或者不稳定的情况。
    
用户进程:
    1.运行在用户空间的进程,他们是由用户启动的应用程序和服务。
    2.用户级别的任务:应用程序,处理用户输入输出等。
    3.用户进程与用户直接进行交互,提供用户页面。
    4.用户进程受到权限限制,不能直接操作内核空间或者内核级别操作,保护系统的安全性。
    5.用户空间的进程崩溃不会影响系统的稳定,因为具有隔离性,防止它影响内核空间与其他的用户空间。


# 用户空间与内核空间关系:
    1.用户空间的应用程序通过直接调用或者shell方式通过系统调用来请求内核服务。
    2.在内核空间内执行这个调用,并且与底层的硬件进行交互完成相关请求(通过驱动与硬件通信)。

# 注意:
    pid=1 负责启动用户空间的进程与服务
    pid=2 负责内核线程,负责创建和调度内核线程。是内核空间所有进程的父进程。

image-20241205225937943


2-4.孤儿进程

怎么产生:

  • 是由父进程在某种原因下,突然挂了,而子进程还是运行。
  • 而这个子进程会被1号进程收养(子进程ppid就变为了1),直到子进程运行完毕后,释放资源(文件,数据,内存,pid)。

image-20241205233830860

2-5.僵尸进程

怎么产生:

  • 父进程创建出子进程,子进程挂了,但是父进程不知道子进程挂了,父进程无法关闭子进程,清除子进程占用的资源,那么子进程就变为一个僵尸进程,会对系统产生危害。

危害:

  • 如果系统产生大量的僵尸进程,占用了系统大量的可分配资源,如进程的pid号(pid号是有限的最大是65535)。系统就无法正确创新进程,完成任务,导致系统无法使用。

image-20230706231724926

识别僵尸进程:

识别僵尸进程:
    top 命令中得 zombie 可以看到 僵尸进程的数量
    ps -ef 查看僵尸进程状态:defunct 代表就是
        比如:root       1278   1277  0 22:50 pts/1    00:00:00 [python] <defunct>

命令:
    top 

# 怎么解决:
    1.kill掉当前僵尸进程的主进程
    2.优化代码,避免当前问题的发生(在使用创建子进程时,子进程执行完毕释放子进程)

# 解决脚本:简单粗暴的直接杀死父进程

#!/bin/bash
zombieID=$(ps -ef | grep '.*<defunct>$' | awk '{print $3}')
for i in $zombieID
do
    kill $i
done

image-20230706230815662

2-5.进程相关命令

2-5-1.ps

命令:
    ps

参数:
    -e # 显示所有进程
    -f # 显示进程的详细信息 pid ppid 进程名字等
    -P # 指定pid 显示内容,例如:ps -fp 2609
    -C # 指定进程名字进行查看 例如:ps -fC sshd
    -U # 指定用户名,查看用户进程信息 ps -Uf root
    -l # 较为详细的输出当前登录pid与相关信息

常用的集中方式:
    ps -ef # 查看系统中全部的进程
    ps -fP 进程号 # 只查看指定进程号的详细信息
    ps -fC 程序名 # 只查看当前程序名的全部进程详细信息
    ps -fU 用户名 # 只查看当前用户使用的进程信息
    ps aux # 查询系统中的全部进程
    ps -lA # 查询所有的进程
    ps axjf # 查看全部的进程包含进程树,可以通过 pstree 来代替

ps -ef 解释:
ps -ef 解释:
    UID:该进程执行的用户ID
    PID:进程ID
    PPID:该进程的父级进程ID,如果找不到,则该进程就被称之为僵尸进程(Parent Process ID)
    C:Cpu的占用率,其形式是百分数
    STIME:进程的启动时间
    TTY:终端设备,发起该进程的设备识别符号,如果显示“?”则表示该进程并不是由终端设备发起(虚拟终端(tty)和ssh终端(pts))
    TIME:进程实际使用CPU的时间
    CMD:该进程的名称或者对应的路径

image-20241208211743649


ps -l 解释:
[root@template ~]# ps -l
F S   UID    PID   PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S     0   1829   1827  0  80   0 - 28919 do_wai pts/2    00:00:00 bash
0 R     0   1910   1829  0  80   0 - 38331 -      pts/2    00:00:00 ps

ps -l 解释:
    F 代表进程标志,代表当前进程的权限:
        4 进程权限位 root
        1 代表尽可复制 fork 无法实际执行 exec
        0 代表就是一个普通的进程,没有任何标志

    S 代表进程的状态
        R 代表正在执行
        S 代表正在睡眠,但是可以被唤醒
        D 不可被唤醒,通常这个进程在等待I/O的情况
        T 停止状态,可能后台停止,或者出现错误
        Z 代表僵尸状态,也就是僵尸进程

    UID/PID/PPID
        代表该进程用户id,当前执行的pid,以及父进程的ppid

    C:
        代表CPU使用率

    PRI/NI
        priority/nice 代表这进程被cpu执行的优先级,数值越小优先级越高

    ADDR/SZ/WCHAN
        内存相关,ADDR是内核的函数,支出该进程在内存的那个部分,如果是running的进程一般表示'-'。
        SZ 代表当前进程使用了多少内存
        WCHAN 表示进程是否在运行中,一般表示'-'代表正在运行,而do_wai的意思就是等待子进程终止(执行ps命令那么bash的进程就会等待这个ps子进程终止)

    TTY
        登录这使用的终端机,如果是远程(ssh)就是ps/n

    CMD
        command的缩写,执行此次命令是什么。

image-20250105223325568


ps aux 解释:
[root@template ~]# ps aux 
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root          2  0.0  0.0      0     0 ?        S    08:07   0:00 [kthreadd]
root       1532  0.0  0.1 115672  2068 tty1     Ss+  08:41   0:00 -bash
root       2002  0.0  0.1 155448  1868 pts/2    R+   09:39   0:00 ps aux


ps aux 解释
    USER
        代表执行当前进程的用户
    PID
        当前进程的pid号码
    %CPU
        进程的cpu使用率
    %MEM 
        进程的内存使用率
    VSZ
        进程使用了多少虚拟内存
    RSS
        进程占用的固定内存
    TTY
        进程在那个终端机上运行的
        ? 代表跟终端机无关
        tty1-tty6 是本机的登陆者
        pts/n 是远程登陆者(ssh)
    STAT
        进程的状态(R运行,S睡眠,T停止可能错误,Z僵尸)
    START
        进程触发启动的时间
    TIME
        使用CPU的时间
    CMD
        执行的进程命令是什么

image-20250105223551648


2-5-2.top

作用:
    是linux的资源管理器,top命令可以进入一个交互式的命令界面,和windows的任务管理器性质相同。
命令:
    top

参数:
    -d <秒> # 会根据秒将整个进程页面更新输出,默认是5秒(也就是5秒刷新一次)
    -b # 重定向将top命令的内存写入到某个文件中 top -b 123.log,如果单独使用的情况下会阻塞(交互式命令)需要ctrl + c 退出。需要配合-n 输出几次,默认5刷新一次。 
    -n <number> # 打印几次top 与 -b 配置才有意义
    -p <pid> # 指定某个pid进行监控,只会查看这个pid的进程输出情况
    
指令:
    ? # 进行输入指令
    z # 打开关闭颜色
    N # pid排序
    M # 按照内存使用率从大到小排序
    P # 按照cpu使用率从大到小排序
    1 # 展示多个cpu内核
    m # 图形显示内存的使用率

命令解释:
# 第一行 系统的基本情况
top - 22:14:53 up  3:47,  1 users,  load average: 0.00, 0.01, 0.03 
    top - 22:14:53:系统的时间
    up  3:47: 系统运行了多久
    1 users:登录的用户时几个
    load average: 0.00, 0.01, 0.03 :展示cpu的负载情况分别指 1 分钟、5 分钟、15 分钟的平均负载。

# 第二行 进程
Tasks: 120 total,   1 running, 119 sleeping,   0 stopped,   0 zombie
    120 total:系统中总进程
    1 running:1个正在运行
    119 sleeping:199个正在睡眠
    0 stopped:停止的进程数
    0 zombie:僵尸进程

# 第三行 cpu
%Cpu(s):  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
    0.0 us:用户模式占用的 CPU 百分比
    0.0 sy:系统占用cpu百分比
    0.0 ni:	改变过优先级的用户进程占用的 CPU 百分比
    100.0 id:cpu的空闲百分比
    0.0 wa :等待输入/输出的进程占用的 CPU 百分比
    0.0 hi:硬中断请求服务占用的 CPU 百分比
    0.0 si:软中断请求服务占用的 CPU 百分比
    0.0 st:虚拟时间百分比,就是当有虚拟机时,虚拟 CPU 等待实际 CPU 的时间百分比

# 第四行/第五行 内存相关
KiB Mem :  2027896 total,  1733684 free,   183024 used,   111188 buff/cache
KiB Swap:        0 total,        0 free,        0 used.  1709008 avail Mem 
    # KiB Mem
    2027896 total:总内存
    1733684 free:空闲内存
    183024 used:使用内存
    111188 buff/cache:缓冲区/缓存区内存使用内存
    # KiB Swap
    0 total:交换虚拟内存的大小
    0 used:已经使用的交换分区的大小
    0 free :空闲交换分区的大小
    1709008 avail Mem :可用内存

# 第六行标题
PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND 
    PID:进程的 ID
    USER:进程所属用户
    PR:优先级,数值越小优先级越高。
    NI:优先级,数值越小优先级越高。
    VIRT:该进程使用的虚拟内存的大小,单位为 KB。
    RES:该进程使用的物理内存的大小,单位为 KB。
    SHR:共享内存大小,单位为 KB。计算一个进程实际使用的内存 = 常驻内存(RES)- 共享内存(SHR)
    S:进程状态。其中S 表示睡眠,R 表示运行
    %CPU:该进程占用 CPU 的百分比。
    %MEM:该进程占用内存的百分比。
    TIME+:该进程共占用的 CPU 时间。
    COMMAND:进程名

image-20241208213251978


2-5-3.htop

htop与glances命令都是与top命令相同,只是可视化效果必要好,添加了其他的功能,方便使用。

yum install -y htop

image-20230709230534246


2-5-4.glances

htop与glances命令都是与top命令相同,只是可视化效果必要好,添加了其他的功能,方便使用。

yum install -y glances  python写的程序可以在windons macos 上进行使用,也可以在web上进行使用(开一个端口在网页查看)

image-20230709231710410


2-5-5.kill

作用:
    杀死进程命令,在执行命令时,会向内核发送信号

命令:
    kill 参数
    
参数:
    -l 查看全部的信号
    21:16 root@linux01 ~ #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	
    
    -1 重新读取一次参数的配置文件(类似于restart,reload)
    -2 代表由键盘出入 
    -9 立即强制删除工农工作
    -15 正常的进程终止操作
    
常用的信号:
    15信号:SIGTERM 默认kill命令什么都不加,默认使用的就是这个信号 `默认信号`
    kill -15 pid #关闭进程,使用这个命令显示`已终止`
    
    9信号:SIGKILL 强制性终止,危险的信号,可能会导致程序出现操作,如果出现杀不死的进程就是用这个信号
    kill -9 pid # 杀死进程,使用这个命令显示`已杀死`
    
    1信号:SIGHUP 无序关闭进程,重现加载配置文件,如reload操作,而reload的操作就是发送的1信号
    比如nginx,修改nginx.conf文件后
    kill -1 nnginxpid # 即可重载nginx配置 同等于 systemctl restart nginx or /usr/sbin/nginx -reload
    

2-5-6.pstree

命令:
    pstree
作用:
    以树性结构查看进程的关系
参数:
    -A 各个进程树之间的ASCII字符链接
    -U 哥哥进场树之家你以utf8符号链接
    -P 列出pid

2-5-7.killall

命令:
    killall
    
作用:
    终止进程,以进程名称
参数:
    -i 进入交互模式,需要用户同意后才会终止进程
    -I 命令名称忽略大小写(可能包含参数)

例如:
    killall -9 httpd

2-6.工作管理(后台管理)

使用注意:

  1. 前台:可以控制与执行命令的环境叫做前台。
  2. 后台,可以自行的执行操作,无法使用快捷方式终止,需要通过别的命令调用终止。
  3. 这个些操作需要再shell子进程操作执行,方便管理。

程序运行有两个方式:

  1. 前台运行,需要占用终端。
  2. 后运行,不影响终端。

2-6-1.临时后台运行

临时的原因:
    当关闭当前的窗口,后台进程就会消失(当前只会在bash环境下运行,关闭这个bash就会消失。)。

使用:
    & # 可以将操作的进程放入后台进行运行,不会占用窗口,窗口关闭就会终止这个后台的工作进程

例如:
    ping 127.0.0.1 > /dev/null & # 如果不将日志写入到文件中,默认就会在会话页面打印日志

1.放入后台运行,并且会打印一个pid
    ping 127.0.0.1 > /dev/null &

2.查看后台运行进程,不会显示pid
    jobs

3.关闭
    pkill -f ping # 要不然 kill pid 进行终止

image-20250105220159524

2-6-2.永久后台运行

永久:
    不会因为关闭当前执行后台命令bash,而导致后台进程消失。
    
语法:
    nohup 执行的命令 & 

例如:
    nohup ping 127.0.0.1 & # 它会在当前目录下创建nohup.out文件,将日志写入这个文件中,在后台运行
    nohup ping 127.0.0.1 > /dev/null & # 如果不将日志写入到文件中,默认就会在会话页面打印日志

1.放入后台运行
    nohup ping 127.0.0.1 > /dev/null &

2.查看后台运行进程
    jobs

3.关闭
    pkill -f ping # 要不然 kill pid 进行终止

image-20241208233810574


2-6-3.&符号解释

情况:
    1.用户执行完毕后,正常退出ssh会话(logout,exit)
        命令 + & :没有问题,依然在后台运行
        nohup + & :没问题,依然在后台操作
    
    2.用户非正常退出(比如关闭ssh窗口),导致后台进程可能会丢失。
        命令 + & :不可靠进程丢失
        nohup + & :没问题,依然在后台操作


单纯使用:& 符号,只能帮助进程,在当前ssh会话中,在后台运行,如果ssh异常端口,进程依然会丢失
    例如: 
        ping baidu.com > /dev/null &
    
    
使用 nohup + & 真的让进程在后台运行,就算ssh会话异常端口,进程也不会丢失
    例如:
        nohup ping baidu.com 2>&1 & # 使用默认的写入的文件 nohup.out
        nohup ping baidu.com > /dev/null 2>&1 & # 指定文件
        

2-6-4.相关命令

1.jobs
    作用:
        将后台执行的进程打印输出
    命令:
        jobs
    参数:
        -l 列出 序号与相关执行的后台命令,还有当前的pid号
        -r 仅列出后台在执行的
        -s 仅列出后台暂停的
 
 2.fg
     作用:
         将后台的进程拿到前台处理
     命令:
         fg %<jobs查询的序号>
 
 3.bg
     作用:
         将后台暂停的进程,让它重新的执行
     命令:
         bg %<jobs查询的序号>
 
 4.kill
     作用:
         终止正在执行的进程。kill后面默认是pid,如果想要管理bash的工作控制,就需要%数字(后台的序号)
     命令:
         kill %<jobs查询的序号>

image-20250105221353466


2-6.进程的执行顺序

PRI(priority)/NI(nice)的说明:
    那个进程的执行的优先级高就需要看priority + nice值。
    # PRI(priority)值是无法修改,是有内核动态调整
    NI(nice)是可以通过命令进行修改的。
        NI值可以修改范围:-19 到 20 之间
        
PRI(priority)/NI(nice)关系:
    PRI(priority) +  NI(nice) = PRI(新的值)

# 默认:
    PRI(priority):无法修改有内核调整
    NI(nice):可以修改,默认为0

2-6-1.CPU进程调度概念

CPU调度概念
    CPU每一秒可能执行多数G次命令,通过内核的CPU调度可以让各个进程被CPU切换运行。

    # CPU采用的方式:
        CPU会根据时间分片的调用度方式,将CPU的时间你分为很小时间片,每个进程(程序)轮流使用这个些时间片,虽然看起来是进程同时运行,但是在'某个时刻,只有几个进程任务在执行(根据CPU核数来定4核就是4个进程任务...)'。

    # 调度方面:
        系统会根据优先级核调度算法来决定那个进程或者线程应该获得CPU的时间片。优先级高就会优先获取(priority决定,而优先级低的进程可能会被延迟执行。但是在人的感官上进程就是在同时运行,因为CPU在1秒内可能调度了上万次进程程序。

    # 注意:如果进程的优先级相同的情况
        会根据不同的算法进行调度:
            1.先来先服务(FCFS):按照进程到达的顺序进行调度。先达到的进程会先调用执行。
            2.短作业优先(SJF):根据预估时间来调度,那个进程调用CPU时间段就优先那个。
            3.轮转调度(RR):将就绪的进程放入队列,然后顺序执行调用。
            4.多级反馈队列调度(MFQ):先将进程按照优先级和运行时间等特定存放到多个队列中,每个不同的队列采用不同的调用策略。
            5.完全公平调度(CFS):基于时间的调度算法,它试图在所有运行的进程之间公平地分配CPU时间。确保每个进程都能合理使用CPU(linux内核采用)

2-6-1.nice未运行优先级修改

命令:
    nice
    
作用:
    修改进程程序的优先级
参数:
    -n # 紧接一个数字 -19 到 20 负值提高,正值降低
    优先级计算方式:PRI + NI = 新的PRI(优先级)

例如:
    nice -n -5 vi   # 提高vi的优先级
    nice -n -5 nginx # 提高nginx的优先级
    nice -n 10 tar -czf backup.tar.gz /path/to/files/ # 降低 tar解压的优先级
    nice -n 15 docker run -d my_image # 调整容器的优先级

image-20250105232950099


2-6-2.renice修改运行中进程

命令:
    renice 

使用:
    rencie <number> PID  # 修改范围 -19 到 20 之间
    优先级的计算方式:PRI + NI = 新PRI

例如:
    renice 10 1829 # 降低1829 PID的进程的优先级
    

image-20250105234329836


3.磁盘

补充:
    当对挂载的硬盘设置格式时,除了挂载的格式还是其他格式(系统自动挂载的,由 Linux 内核和系统初始化过程自动管理),目的不同。

1.tmpfs格式:
    是一种基于内存的文件系统,也可以使用交换空间。它通常用于存储临时文件,这些文件在系统重启后不会保留。
    可以提供比磁盘更快的读写速度,因为它主要在内存中操作,它通常用于存储需要快速访问但不需要持久化的数据,如系统日志、会话信息等。

2.devtmpfs格式:
    用于存储设备文件。它在系统启动时自动挂载,并且可以动态地创建和删除设备文件,以反映系统中当前连接的硬件设备。通常用于 /dev 目录,它允许系统在设备被识别时动态地创建设备文件,而不是在启动时预先创建所有可能的设备文件。

3-1.df

作用:
    列出各文件系统的磁盘使用情况

命令:
    df

参数:
    -h 用常见的格式显示出大小(例如:1K 234M 2G) 
    -i 列出inode数量,展示使用情况
    -T 列出文件系统的格式。
    -k 列出使用情况

image-20241208214224318


3-2.iotop

安装:
    yum install -y iotop

作用:
    实时的展示磁盘的i/o写入情况

命令:
    iptop

参数:
    -k 以kb显示 i/o读写
    -o 只显示写入i/o的进程信息
    -b 批量显示,无交互,主要用户记录到文件中
    -n NUM:显示NUM次,主要用于非交互式模式。
    -d SEC:间隔SEC秒显示一次。
    -p PID:监控的进程pid。
    -u USER:监控的进程用户。

指令参数:
    r 改变io写入排序顺序(大到小,小到大)
    o 只显示有io输出的进程
    p 进程/显示显示方式的切换,切换pid tid
    a 显示累计使用量

image-20241208214352922


3-3.lsblk

作用:
    列出所有的块设备,而且还能显示他们之间的依赖关系

命令:
    lsblk

参数:
    -f 显示文件系统

image-20241208214938298


4.cpu

cpu的相关在linux中的目录:
    /proc/cpuinfo

# 命令:top htop glances 查看进程对命令的讲述部分。

4-1.uptime

作用:
    查看cpu负载情况(静态,top动态)

命令:
    uptime

说明:
    load average: 0.00, 0.01, 0.02
                 |	 |	  |---> 15分钟cup负载情况
                 |	 |---> 5分钟cup负载情况
                 |---> 1分钟cpu负载情况	
                
     如果:1分钟高 5分钟低 15分钟低 :cup压力上升
     如果:1分钟低 5分钟高 15分钟高 :cup压力下降

image-20241208215237503


4-2.cup压力测试

cup压力来自于高频计算,比如数值计算,可以在使用bash程序,python程序,以及各种语言,来实现负载的高频计算。

# 运行多进程对cup进行压力测试

工具:
    stress 是一个linux压测试工具,专门对于设备的cup io 内存 负载 磁盘 进行压力测试
    mpstat 多核cpu性能分析
    pidstat 实时查看cpu 内存 io指标
    

使用stress工具压力测试:

1.安装
    yum install stress -y	

2.使用
    # 这个命令会让你的cpu跑满100%,到达高压状态
    --cpu 4 :跑了4个进程,如果是1个cup,那么这4个进程就会分摊为每个25%将cup占满,如果是4个cup那么就会每个100%占用每个cpu
    stress --cpu 4 --timeout 600

5.网络

网络:
    计算机的网络是由一大堆协议组成的。
    如果没有网络那么就需要将机器之间链接网线进行传输数据,现在有了更方便的网络,蓝牙等无限信号,就能隔空传输文件。
    不限于机器时间的文件传输,还有其他各种需求,域名解析、www网络服务,ping命令的icmp协议,VPN的特殊协议,时间同步的ntp协议。

与服务器进行通信:
    1.知道服务器的ip地址,对应tcp/ip协议,ip地址号
    2.端口号,对应了应用层
    3.只有知道ip地址,才知道这个服务器在哪里,只有知道服务器的端口,才能链接到服务器对应的程序上获取数据,或者发送数据

tcp/udp区别是什么(都是在传输层):
    tcp :相对慢,但可靠,比如文件传输,客户端与服务端需要身份认证,链接时需要3次握手过程,断开链接时需要4次挥手过程
    udp :速度快,不可靠,比如视频语音传输

计算机网络过程
    1.机器需要网卡,需要链接网线(物理层)
    2.安装网卡的驱动,从网络适配器上拿到ip
    3.计算机之间可以基于ip地址,进行数据交互
    4.应用层(网站服务http)

image-20241208210245426


5-1.netstat

安装:
    yum install net-tools -t
    
作用:
    查看网络的端口情况

命令:
    netstat 

参数:
    -t 列出tcp协议链接
    -u 列出udp协议链接
    -l 表示过滤出"stat"列中值为LISTEN(监听)的链接
    -p 显示出发起链接的进程pid和进程名称
    -n 将主机名解析为ip地址,如果不适用参数,那么就会显示主机名或者localhost
    -a 列出全部端口
    -i 显示网络接口
    -r 显示可信路由

解释state字段关键字:
    ESTAB 表示这个 TCP 连接已经建立,处于稳定状态,可以进行数据传输
    FREE 套接字未连接
    LISTENING 套接字正在监听一个连接请求。
    CONNECTING 套接字正要建立连接。
    CONNECTED 套接字已连接。
    DISCONNECTING 套接字已断开。
    (empty) 套接字未连接

套接字使用的一些类型:
    SOCK_DGRAM 此套接字用于数据报(无连接)模式。
    SOCK_STREAM 流模式(连接)套接字。
    SOCK_RDM 一种服务可靠性传递信息。
    SOCK_SEQPACKET 连续分组套接字。
    SOCK_PACKET RAW接口使用套接字。
    UNKNOWN

image-20241208220340515


5-1-1.解释

[root@template ~]# netstat
Active Internet connections (w/o servers) # 与网络比较相关的部分
Proto Recv-Q Send-Q Local Address           Foreign Address         State      
tcp        0     36 template:ssh            192.168.85.1:64933      ESTABLISHED
tcp        0      0 192.168.85.137:ssh      192.168.85.1:64389      ESTABLISHED
Active UNIX domain sockets (w/o servers) # 与本机的进程自己相关部分(非网络)
Proto RefCnt Flags       Type       State         I-Node   Path
unix  2      [ ]         DGRAM                    17945    /var/run/chrony/chronyd.sock
unix  2      [ ]         DGRAM                    14364    /run/systemd/shutdownd
unix  3      [ ]         DGRAM                    555      /run/systemd/notify
unix  2      [ ]         DGRAM                    557      /run/systemd/cgroups-agent
unix  5      [ ]         DGRAM                    572      /run/systemd/journal/socket
unix  15     [ ]         DGRAM                    574      /dev/log

...

# 解释第一部分:
Proto Recv-Q Send-Q Local Address           Foreign Address         State      
tcp        0     36 template:ssh            192.168.85.1:64933      ESTABLISHED
tcp        0      0 192.168.85.137:ssh      192.168.85.1:64389      ESTABLISHED

    Proto:网络协议数据包分别是 tcp/udp
    Recv-Q:非由用户进程链接到socket的复制总字节数
    Send-Q:非由远程主机传送过来的acknowledged总字节数
    Local Address:本地ip端口情况
    Foreign Address:远程主机ip端口情况
    State链接状态:主要有建立(ESTABLISHED)和监听(listen)

# 解释第二部分:
Proto RefCnt Flags       Type       State         I-Node   Path
unix  2      [ ]         DGRAM                    17945    /var/run/chrony/chronyd.sock
unix  3      [ ]         STREAM     CONNECTED     21602

    Proto:一般是unix
    RefCnt:链接到当前socket的数量
    Flags:链接表示
    Type:socket访问类型,有确定链接(STREAM)不需要要确定(DGRAM)
    State:如果是 CONNECTED 表示多个进程之间建立链接
    Path:socket相关文件的路径

image-20250105234714852


5-2.ss

用法与netstat命令一样
在高并发场景下,也就是机器的链接数特别多的时候,使用ss性能比netstat性能要高

命令:
    ss

参数:
    -t (TCP):显示 TCP 套接字。
    -u (UDP):显示 UDP 套接字。
    -a (All):显示所有套接字。
    -n (Numeric):不解析服务名称,直接显示 IP 地址和端口号。
    -l (Listening):显示监听状态的套接字。
    -i (Interface):显示每个套接字的接口信息。
    -p (Process):显示使用套接字的进程信息。
    -e (Extended):显示更多的统计信息。
    -s (Summary):显示套接字的摘要信息。
    -M:显示与 TCP 内存相关的统计信息。
    -o:显示套接字的选项信息。

例如:我需要显示连接当前tcp服务的套接字信息
    ss -nt

image-20241208220834448


5-3.iftop

安装:
    yum install -y iftop

作用:
    这个命令与top命令相似,实时的监控服务器发出流量与接受的流量。

5-4.ifconfig

作用:
    是一个用来查看、配置、启用或禁用网络接口的工具,这个工具极为常用的。

命令:
    ifconfig

参数:
    up 启动指定的网卡设备
    down 关闭网卡设备

1.修改网卡的ip地址
    ifconfig 接口名称 IP地址 netmask 子网掩码
    
3.启动网卡
    ifconfig 接口名称 up

4.关闭网卡
    ifconfig 接口名称 down

5.查看指定网卡
    ifconfig 接口名称

5-5.ip

作用:
    用于网络配置使用

命令:
    ip

参数:
    ip link or l:查看或设置网络接口。
    ip addr or a:查看或设置网络接口的 IP 地址。
    ip route or r:查看或设置路由表。
    ip rule :查看或设置路由规则。
    ip neigh or n:查看或设置邻居表。
    ip tunnel:查看或设置隧道接口。
    ip maddr or m:查看或设置多播地址。
    ip monitor:监视网络接口的变化

1.添加默认路由:
    ip route add default via <网关IP>

2.删除 IP 地址
    ip addr del <IP地址>/<子网掩码> dev <接口名>

3.添加 ip 地址
    ip addr add <IP地址>/<子网掩码> dev <接口名>
        
4.启用网络接口:
    ip link set <网卡名> up

5.禁用网络接口
    ip link set <网卡名> down

6.补充

6-1.分析内核信息

命令:
    dmesg

例如:
    dmesg | more # 输出内核开机的信息
    dmesg | grep -i hd # 输出硬盘相关信息

6-2.检测系统资源变化

命令:
    vmstat 

参数:
    vmstat [-a]	[number] # cpu/内存相关信息
    vmstat [-fs] # 内存相关
    vmstat [-s 单位] # 显示数据单位
    vmstat [-d ] # 与磁盘相关
    vmstat [-p 分区] # 与磁盘相关

    -a 使用inactive/active代替buffer/cache内存输出
    -f 开机到目前位置系统复制(fork)进程数
    -s 将一些事件(开启到现在)导致内存变化说明
    -S 跟上单位例如:K/M 代替bytes的容量
    -d 列出磁盘读取总数量统计
    -p 跟上分区,显示分区的读写总数量

例如:
    vmstat 1 3 # 统计目前cpu的状态每秒1次,共计三次
    
解释:
    进程字段(procs):
        r 代表等待运行的进程
        b 不可唤醒的进程
        # 这两个数量越多代表系统越忙碌
        
    内存字段(memory):
        swpd:虚拟内存被使用容量
        free:未被使用内存容量
        buff:缓冲区容量
        cache:缓存区容量
    
    内存交换空间(swap):
        si:由磁盘将程序取出量
        so:由于内存不足将程序写入磁盘的swap的容量
        # 如果si/so值越大,性能就会越来越差。
    
    磁盘(io):
        bi:磁盘写入块数
        bo:写入到磁盘的块数
        # 如果bi/bo越大代表系统的i/o越忙碌
    
    系统(system):
        in:每秒被终端进程的数量
        cs:每秒钟被切换事件的数量
        # 如果两个值越大,代表系统与接口设备的通信越频繁(接口包含:网卡,磁盘,时钟等)
    
    cpu:
        cs:进程上下文切换数量
        us:非内核层的cpu使用状态
        sy:内核层使用cpu状态 
        id:闲置状态
        wa:等待i/o所消耗cpu状态
        st:被虚拟机所盗用的cpu状态

image-20250106000541867


6-3./proc/*的意义

所有进程都在内存中,而内存的数据都写入了/proc/*的文件目录下,可以通过'ls /proc/* ' 进程查看。
数字就代表了当前某一个程序的进程的pid都是以文件或者文件夹的形式展示(Linux的核心一切皆文件)。

image-20250106001841133


文件名 内容
/proc/cmdline 加载kernel所执行的参数。
/proc/cpuinfo cpu相关信息,包含频率,类型,运算功能
/proc/devices 记录系统各个主要设备的主要设备号,与mknod相关
/proc/filesystems 目前系统已经加载的文件系统
/proc/interrupts 目前系统上irq分配状态
/proc/ioporst 系统上各个设备所配置i/o地址
/proc/kcore 内存大小
/proc/loadavg top中uptime,记录的最上面的平均值记录在这个文件中
/proc/meminfo free命令的信息都记录在这个文件中
/proc/modules linux已经加载的模块。驱动程序
/proc/mounts 系统挂载的数据,通过mount查看数据
/proc/swaps 系统加载的内存,使用分区记录
/proc/partitions 使用fidis -l 显示的分区信息记录在这里
/proc/pci pci总线上的设备详情,使用lspci查看
/proc/uptime 就是uptime命令出现的信息
/proc/version 内核版本,uname -a 查看就是这个文件的信息
/proc/bus/* 一些总线设备,还有usb设备的都记录在这里

6-4.查询已打卡文件或者已经执行程序打开文件

6-4-1.lsof

作用:
    显示系统打开的文件
    yum install lsof

命令:
    lsof

参数:
    -c # 指定进程名字,打开那些系统文件 如 lsof -c nginx,nginx进程打开了那些文件
    -i # 网络连接的情况(可以指定端口或者协议)
    -p # 显示指定pid打开的文件
    -u # 显示uid打开的文件,以及具体的进程信息 lsof -u root 就会显示root用户打开那些具体文件
    +d # 显示文件夹下被打开的文件有哪些 lsof +d /var/log/nignx
    +D # 递归乐厨文件目录下那些文件被进程打开
    -n # 不显示主机名。直接显示ip
    -P # 不显示端口名 直接显示端口
    -s # 列出文件大小
    -U # 列出全部的套接字

例如:
    lsof -u root -a -U # 列出全部的root所有进程打开的socket文件
    lsof +d /dev # 列出系统上所有被启动的周边设备
    lsof -u root | grep bash # 列出当前bash进程打开的文件
    lsof -p 1982 # 查看 1982打开了哪些文件
    lsof +D /var/log/httpd/ # 查看特定文件或目录的打开情况
    lsof -d 3 # 查看文件描述符号为3的文件
    lsof -i :80 # 查看80端口的服务
    lsof -i tcp # 查看当前机器全部的tcp服务

6-4-2.fuser

命令:
    fuser

参数:
    -a 与程序相关的所有文件
    -u 列出当前文件被那个(用户)进程使用
    -m 后面接的那个文件会主动提到该文件系统的所有顶层
    -v 列出每个文件与进程还有命令的相关性
    -k 找出该文件/目录的pid,并试图以sigkill这个信号给于该pid
    -i 需要与 -k 参数配合,在删除pid之前会询问用户
    -signal 例如 -1 -15等,如果不加默认就是 -9信号
    -l 显示所有信号
    -c 指定目录

例如:
    fuser /var/log/httpd/access_log # 查看当前文件被哪些进程占用
    fuser -c /var/log/httpd/ # 某个目录下的所有文件正在被哪些进程使用
    fuser -uv . # 查看当前目录下的所有进程
    fuser -uv /proc # 找到 /proc 文件的进程
    fuser -u /var/log/httpd/access_log # 列出当前文件被那个用户使用和pid
    fuser 80/tcp # 查看80端口tcp协议的进程

6-4-3.pidof

命令:
    pidof

参数:
    -s 列出一个pid,不显示全部的与之相关的pid
    -x 同时列出 program name 可能的ppid与pid

例如:
    pidof httpd # 列出全部的pid(包含父进程与子进程pid)