• 认识系统服务


    daemon与service

    达成某个服务(service)需要一个守护进程(daemon)在后台运行。

    • 实现 ssh 服务,需要 sshd 这个守护进程
    • 实现 mysql 服务,需要 mysqld 这个守护进程
    • 实现 cron 服务,需要 crond 这个守护进程

    daemon守护进程通常在service服务的名称后加上一个d

    init管理下daemon的主要分类

    开机过程中系统核心第一支呼叫的程序是 init,然后 init 唤起所有的系统所需的服务。

    启动服务的脚本位置

    所有服务的启动脚本都放在 /etc/init.d/ 目录下

    启动、关闭、查看服务

    启动:/etc/init.d/服务名 start

    停止:/etc/init.d/服务名 stop

    重启:/etc/init.d/服务名 restart

    查看:/etc/init.d/服务名 status

    服务启动分类

    根据服务是独立启动或被一支总管程序管理分为两类

    独立启动(stand alone):服务独立启动,该服务直接常驻内存,为本机或用户提供服务,反应速度快。

    总管程序:(super daemon):由特殊的xinetd或inetd这两个总管程序提供socket对应或port对应的管理。当没有用户需求某socket或port时,所需要的服务不会被启动;当有用户需求时,xinetd会去唤醒对应的服务程序;当需求结束时,被唤醒的服务也会被结束。反应稍慢。

    服务相依性

    init在管理员手动处理服务时,无法唤醒相依的服务

    启动级别

    共7个等级:

    • 0级:是Linux系统最低和最重要的级别,它表示关机,是关机模式,一般是系统重启或者停止时使用。
    • 1级:是进入系统修复模式,一般用于系统出现故障时调试使用。分为单用户模式和多用户模式两种情况,在单用户模式下进行一些系统检测、修复工作,在多用户模式下开启系统的基本服务。
    • 2级:是Linux系统的正常运行状态,一般用于在非安全网络环境中使用,开启常规的系统服务。
    • 3级:纯文本模式,用户级,它开启了X Window系统服务,一般用于安全的网络环境中。能够实现X Window系统的图像化操作,可以完成网络连接、文件传输和输入/输出工作等。
    • 4级:为保留状态,方便用户在图形化环境下改变服务的起停状态,这种级别并不是必须的,可以把它修改成第3级或者更低的级别。
    • 5级:为完全图形化模式,Linux系统在这种模式下自动启动X Window系统,并配置对应的登录用户以及密码,可以从远程服务器启动桌面环境,应用于安全的网络环境。
    • 6级:为重新启动,一般用于系统重启时使用,系统会自动开启服务,并在重启后重新加载所有服务。

    各个等级的启动脚本是通过 /etc/rc.d/rc[0-6]/Sxxdaemon 链接到 /etc/init.d/daemon;

    Sxxdaemon功能为:

    • S表示启动该服务,xx是数字,代表启动顺序,如此开机时可依序启动所需服务,同时解决服务相依问题。数字越小,越先运行,通常是被依赖的服务。
    • K表示关闭该服务,xx是数字,代表关闭顺序,数字越小,越先运行,通常需要依赖别的服务

    设定开机启动

    开机启动:chkconfig 服务名 on

    开启不启动:chkconfig 服务名 off

    查看是否开机启动:chkconfig --list 服务名

    将某服务加入chkconfig管理:chkconfig --add 服务名

    将某服务从chkconfig中删除:chkconfig --del 服务名

    设定服务启动级别为2345:chkconfig --level 2345 服务名 on/off

    手动设定为开机启动

    将程序命令或脚本的绝对路径写入至 /etc/rc.d/rc.local 中

    以httpd服务手动设置为开机自启

    1. [root@localhost ~]# cat /etc/rc.d/rc.local
    2. #!/bin/sh
    3. #
    4. # This script will be executed *after* all the other init scripts.
    5. # You can put your own initialization stuff in here if you don't
    6. # want to do the full Sys V style init stuff.
    7. touch /var/lock/subsys/local
    8. /usr/sbin/apachectl start

    手动编写服务启动脚本

    固定写法部分

    • #/bin/bash ---> shebang机制,必写
    • # chkconfig: - 96 3 ---> 必写,- 表示任何运行级别下都不启动,可改为“2345”等;96 表示S启动时顺序;3 表示K关闭时顺序;可通过chkconfig --list 服务名 查看。仅影响开机启动时的设定。
    • # description: xxx ---> 必写,表示描述
    1. #!/bin/bash
    2. # chkconfig: - 96 3
    3. # description: This is test service script
    4. . /etc/init.d/functions
    5. start(){
    6. [ -e /var/lock/subsys/testsrv ] && exit || touch /var/lock/subsys/testsrv
    7. echo $PATH
    8. action "Starting testsrv"
    9. sleep 3
    10. }
    11. stop(){
    12. [ -e /var/lock/subsys/testsrv ] && rm /var/lock/subsys/testsrv || exit
    13. action "Stopping testsrv"
    14. }
    15. status(){
    16. [ -e /var/lock/subsys/testsrv ] && echo "testsrv is running..." || echo "testsrv is stopped"
    17. }
    18. case $1 in
    19. start)
    20. start
    21. ;;
    22. stop)
    23. stop
    24. ;;
    25. restart)
    26. stop
    27. start
    28. ;;
    29. status)
    30. status
    31. ;;
    32. *)
    33. echo $"Usage: $0 {start|stop|status|restart}"
    34. exit 2
    35. esac

    切换启动级别

    init 数字

    systemd管理下的unit分类

    centos7以后,弃用init,改用systemd。优点如下:

    1. 平行处理所有服务,加速开机流程。旧init启动脚本是一项一项依序启动,systemd可以使所有的服务同时启动
    2. 极速响应。全部服务仅由一支systemd服务搭配systemctl命令管理,且systemd常驻内存,响应快
    3. 服务相依性的自我检查。systemd可自定义服务相依性的检查,若A服务依赖B服务才能启动,当手动启动A服务时,systemd会自动帮助启动B服务
    4. 依据daemon功能分类。systemd定义所有的服务为一个服务单元unit,并将该unit归类到不同的服务类型type,共12种。
    ServiceUnit用于定义一个系统服务
    TargetUnit用于将多个Unit组成一个组
    DeviceUnit用于描述硬件设备
    MountUnit用于文件系统的挂载点
    AutomountUnit用于自动挂载点
    PathUnit用于定义文件或路径
    ScopeUnit用于描述不是由Systemd启动的外部进程
    SliceUnit用于进程组
    SnapshotUnit用于Systemd快照,可以回溯到某个快照
    SocketUnit用于进程间通信的socket
    SwapUnit用于swap文件
    TimerUnit用于定时器

    注意:若某个服务是管理员手动启动的,不是使用systemctl启动的,那么systemd将无法侦测到该服务且无法管理

    systemd配置文件存放目录

    /etc/systemd/system

    这是系统默认的systemd配置文件目录。在这个目录中,可以创建和修改自定义的systemd服务单元配置文件。这些配置文件定义了服务的名称、依赖项、启动顺序、运行环境等等。

    /usr/lib/systemd/system

    这是系统级别的systemd配置文件目录。在这个目录中,通常包含一些系统级别的服务和应用程序的配置文件。这些配置文件通常由软件包管理器在安装过程中自动创建和更新。类似CentOS6中的 /etc/init.d 目录

    /usr/local/lib/systemd/system

    这是用户级别的systemd配置文件目录。在这个目录中,可以创建和修改用户级别的服务单元配置文件。这些配置文件只在当前用户的主目录下有效,不会影响其他用户。

    /run/systemd/system

    这是运行时创建的systemd配置文件目录。在这个目录中,会存储正在运行的服务单元的配置文件。这些配置文件只在当前会话中有效,当系统重新启动时,这些配置文件会被清除。

    systemctl管理服务

    管理单一服务

    systemctl 命令

    常见状态

    • active(running):正在运行
    • active(exited):仅执行一次就正常结束的进程
    • active(waiting):正在执行当中,需要等待其它事件进来才能继续处理
    • inactive(dead):没有运行

    预设状态

    • enabled:开机自启
    • disabled:开启不自启
    • static:自己不能启动,可被其它 enabled 的服务唤醒,相依性
    • mask:无论如何都无法启动,因为已被强制注销(非删除)。systemctl unmask可恢复
    以httpd服务示例

    查看httpd服务状态

    1. [root@wenzi ~]# systemctl status httpd
    2. ● httpd.service - The Apache HTTP Server 描述服务
    3. Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled) 服务已加载,未设置开机自启,厂商预设不开机自启
    4. Active: active (running) since Wed 2023-10-18 04:56:09 CST; 3s ago httpd服务状态
    5. ...

    设置为开机自启

    1. [root@wenzi ~]# systemctl enable httpd
    2. Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.

    由此可见,enable实际通过链接将 httpd.service 挂在了multi-user.target下,而Linux开机流程中会加载multi-user.target,所以实现开机时启动。

    取消开机自启

    1. [root@wenzi ~]# systemctl disable httpd
    2. Removed symlink /etc/systemd/system/multi-user.target.wants/httpd.service.

    由此可见,disable实际是删除了挂在multi-user.target下的httpd链接文件

    强制注销服务

    1. [root@wenzi ~]# systemctl mask httpd
    2. Created symlink from /etc/systemd/system/httpd.service to /dev/null.
    3. [root@wenzi ~]# systemctl status httpd
    4. ● httpd.service
    5. Loaded: masked (/dev/null; bad)
    6. Active: inactive (dead)
    7. Oct 18 04:56:09 wenzi.localhost systemd[1]: Starting The Apache HTTP Server...
    8. Oct 18 04:56:09 wenzi.localhost httpd[68352]: AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using wenzi.localhost. Set the 'ServerNam...this message
    9. Oct 18 04:56:09 wenzi.localhost systemd[1]: Started The Apache HTTP Server.
    10. Oct 18 05:06:06 wenzi.localhost systemd[1]: Stopping The Apache HTTP Server...
    11. Oct 18 05:06:07 wenzi.localhost systemd[1]: Stopped The Apache HTTP Server.
    12. Hint: Some lines were ellipsized, use -l to show in full.
    13. [root@wenzi ~]# systemctl start httpd
    14. Failed to start httpd.service: Unit is masked.
    15. 恢复
    16. [root@wenzi ~]# systemctl unmask httpd
    17. Removed symlink /etc/systemd/system/httpd.service.

    注销的实质是让启动的脚本指向 /dev/null

    观察服务

    systemctl 等价于 systemctl list-units

    列出所有已安装的unit

    1. [root@wenzi ~]# systemctl list-unit-files
    2. UNIT FILE STATE
    3. ...
    4. crond.service enabled
    5. httpd.service disabled

    只列出service类型的unit

    1. [root@wenzi ~]# systemctl list-units --type=service
    2. UNIT LOAD ACTIVE SUB DESCRIPTION
    3. auditd.service loaded active running Security Auditing Service
    4. crond.service loaded active running Command Scheduler

    查看socket服务的socket file 文件位置

    1. [root@wenzi ~]# systemctl list-sockets
    2. LISTEN UNIT ACTIVATES
    3. /dev/log systemd-journald.socket systemd-journald.service
    4. /run/dbus/system_bus_socket dbus.socket dbus.service
    5. /run/systemd/initctl/fifo systemd-initctl.socket systemd-initctl.service
    6. /run/systemd/journal/socket systemd-journald.socket systemd-journald.service
    7. /run/systemd/journal/stdout systemd-journald.socket systemd-journald.service
    8. /run/systemd/shutdownd systemd-shutdownd.socket systemd-shutdownd.service
    9. /run/udev/control systemd-udevd-control.socket systemd-udevd.service
    10. kobject-uevent 1 systemd-udevd-kernel.socket systemd-udevd.service

    查看所有服务与端口号的对应关系

    1. [root@wenzi ~]# cat /etc/services
    2. tcpmux 1/tcp # TCP port service multiplexer
    3. tcpmux 1/udp # TCP port service multiplexer
    4. rje 5/tcp # Remote Job Entry
    5. rje 5/udp # Remote Job Entry
    6. ...
    7. ssh 22/tcp # The Secure Shell (SSH) Protocol
    8. ...

    管理不同操作环境(target unit)

    和操作界面相关性较高的target主要有:

    • graphical.target:文字加图形界面,包含multi-user.target
    • multi-user.target:纯文本模式
    • rescue.target:额外的临时系统,当系统启动时遇到严重错误,无法使用root登录系统时,无法正常进入预期的运行级别(runlevel)时,系统会进入'rescue.target'。在这个模式下,系统会启动必要的服务以维持基本的功能,允许用户在系统上运行命令和修复问题
    • emergency.target:紧急处理系统的错误,需要使用root登录,当rescue.target不可用时,可采用此模式
    • shutdown.target:关机
    • getty.target:设计tty数量

    永久设置为图形界面,重启生效

    1. [root@wenzi ~]# systemctl get-default
    2. multi-user.target
    3. [root@wenzi ~]# systemctl set-default graphical.target
    4. Removed symlink /etc/systemd/system/default.target.
    5. Created symlink from /etc/systemd/system/default.target to /usr/lib/systemd/system/graphical.target.
    6. [root@wenzi ~]# reboot

    临时改变为图形界面,不重启即可生效

    [root@wenzi ~]# systemctl isolate graphical.target

    其它命令

    systemctl poweroff系统关机
    systemctl reboot重启
    systemctl suspend进入暂停(睡眠)模式
    systemctl hibernate进入休眠模式
    systemctl rescue强制进入救援模式
    systemctl emergency强制进入紧急救援模式

    suspend:指的是除了内存以外的大部分机器部件都进入断电状态,并未实际关机,当唤醒机器时,数据会从内存中恢复,重启驱动大部分的机器硬件,开始正常工作,唤醒速度快。

    hibernate:将系统状态保存到硬盘中,然后关闭所有设备,当唤醒机器时,数据从硬盘中读取,唤醒速度较慢

    通过systemctl分析各服务之间相依性

    multi-user.target 使用哪些unit

    1. [root@wenzi ~]# systemctl list-dependencies multi-user.target
    2. multi-user.target
    3. ● ├─auditd.service
    4. ● ├─crond.service
    5. ● ├─dbus.service
    6. ...

    哪些unit使用multi-user.target

    1. [root@wenzi ~]# systemctl list-dependencies multi-user.target --reverse
    2. multi-user.target
    3. ● └─graphical.target

    systemctl针对service类型的配置文件

    相关目录

    以vsftpd为例,若要额外修改 vsftpd.service 时,可参考:

    • /usr/lib/systemd/system/vsftpd.service        官方预设的service配置文件
    • /etc/systemd/system/vsftpd.service.d/custom.conf     建立 “预设service配置文件.d” 文件名的目录,再在该目录下建立配置文件 xxx.conf 即可,此目录下的配置会进入 /usr/lib/systemd/system/vsftpd.service
    • /etc/systemd/system/vsftpd.service.wants/*     此目录内的文件为链接文件,设定相依服务的关系。含义:启动vsftpd.service 之,然后启动此目录下的服务。
    • /etc/systemd/system/vsftpd.service.requires/*     此目录内的文件为链接文件,设定相依服务的关系。含义:启动vsftpd.service 之,先启动此目录下的服务。

    xxx.service文件详解

    以sshd.service为例

    [root@wenzi ~]# cat /usr/lib/systemd/system/sshd.service
    [Unit]
    Description=OpenSSH server daemon
    Documentation=man:sshd(8) man:sshd_config(5)
    After=network.target sshd-keygen.service
    Wants=sshd-keygen.service

    [Service]
    Type=notify
    EnvironmentFile=/etc/sysconfig/sshd
    ExecStart=/usr/sbin/sshd -D $OPTIONS
    ExecReload=/bin/kill -HUP $MAINPID
    KillMode=process
    Restart=on-failure
    RestartSec=42s

    [Install]
    WantedBy=multi-user.target

    Unit部分

    Description

    服务的简介说明。

    systemctl list-units的Description列

    systemctl status sshd的第一行内容

    Documentaion

    提供文件查询帮助功能。格式:

    • Documentaion=http://www...
    • Documentaion=man:sshd(8)
    • Documentaion=file:/etc/ssh/sshd_config
    After

     此处指定的unit必须在当前unit之 前 启动

    Before此处指定的unit必须在当前unit之 后 启动
    Requires此处指定的unit必须在当前unit之 前 启动,否则当前unit启动失败
    Wants此处指定的unit必须在当前unit之 后 启动,不影响当前unit
    Conflicts表示冲突的服务,此处指定的unit和当前unit只能有一个可以启动。

    Service部分

    Type

    daemon的启动方式,影响ExecStart。

    • simple:默认值,此daemon主要由ExecStart接的命令启动,启动后常驻内存
    • forking:以 fork 方式从父进程创建子进程,创建后父进程会立即退出
    • oneshot:一次性进程,如文件系统检查与挂载
    • dbus:此daemon取得D-Bus名称后才会继续运行,通常也会设定BusName=xxx
    • idle:所有的工作都顺利执行完毕后才会执行此daemon
    EnvironmentFile指定启动脚本的环境配置文件
    ExecStart实际启动此daemon的命令或脚本程序
    ExecStartPre执行ExecStart前执行的命令
    ExecStartPost执行ExecStart后执行的命令
    ExecStop实际停止服务的命令,与systemctl stop 有关
    ExecReload实际重启服务的命令,与systemctl reload 有关
    Restart

    定义自动重启当前服务的情形。如

    • always        总是
    • on-success     成功时
    • on-failure      失败时
    • on-abnormal     异常时
    • on-abort     中止时
    • on-watchdog     描述在看门狗计时器(一种监控系统运行的机制)触发时触发的动作或事件。这可能涉及到系统的重启、故障恢复或其他类型的自动纠正措施
    RemainAfterExit当此值为1时,此daemon所属的所有程序都终止后,会再次尝试启动
    TimeoutSec此服务未能正常启动或正常终止时,等待多久强制结束
    KillMode
    • process        当daemon停止时,只终止主要程序(ExecStart后的指令)
    • control-group     当前控制组里面的所有子进程,都会被杀掉
    • none     没有进程会被杀掉,只是执行服务的stop命令
    RestartSec此服务被关闭需要重新启动时,间隔多久,预设100ms

    Install部分

    WantedBy后面大部分接 .target unit,此unit归属哪个target unit,大多数服务性质的unit都在 multi-user.target
    Also当前unit本身被enable时,此处接的unit也enable
    Alias进行一次软链接
  • 相关阅读:
    win10电脑右键新建没有记事本的解决方法
    遗留系统陷入困境
    iNFTnews | 国内NFT发展仅限于数字藏品吗?
    LeetCode 热题100——栈与队列专题(三)
    缩短从需求到上线的距离:集成多种工程实践的稳定框架 | 开源日报 No.55
    平板消解加热台-温度均匀,防腐蚀-实验室化学分析
    solidity部署和验证代理合约
    汽车OTA技术门槛提升,具备软硬一体化能力的Tier1优势凸显
    web渗透之攻击 Authentication-1-
    redis中的zset的原理
  • 原文地址:https://blog.csdn.net/qq_40875048/article/details/133897441