• Linux基础——服务


    服务是什么?

    服务是常驻在内存中的程序,通常用于提供系统或网络功能,用于启动service的二进制文件称为daemon

    init的服务管理

    在Unix的system V版本中,启动服务的管理方式被称为SysV的init脚本程序处理方式,即系统核心第一个调用的程序为init,再由init调用其他服务

    服务的开关和观察

    所有服务启动脚本放置于 /etc/init.d

    • 启动:/etc/init.d/daemon start
    • 关闭:/etc/init.d/daemon stop
    • 重启:/etc/init.d/daemon restart
    • 观察:/etc/init.d/daemon status

    服务的分类

    • stand alone:服务独立启动,并常驻在内存中
    • super daemon:由 xinetd或inetd 两个super daemon对socket、port管理,当有用户要求时才会去唤醒相对应的daemon,要求结束后服务也会结束

    执行等级

    init 根据用户的执行等级来调用不同的服务,从而进入不同的操作界面,等级为0-6,其启动脚本放置在 /etc/rc[0-6].d,连接到/init.d的daemon

    ,
    命令 init [num] 可切换执行等级,其会自动启动 rc[0-6].d 的脚本

    开机启动服务

    根据上面,可知只要在 /etc/rc[0-6].d 下放置链接文件即可完成开机启动,也可使用如下命令

    • 开机启动:chkconfig daemon on
    • 取消开机启动:chkconfig daemon off
    • 查看是否开机启动:chkconfig --list daemon

    systemd的服务管理

    systemd将daemon统称为服务unit,每种服务依据功能区分为不同type

    相关文件

    • /usr/lib/systemd/system:存放服务启动脚本
    • /run/systemd/system:系统执行过程中产生的服务脚本,优先比上面高
    • /etc/systemd/system:管理员依据系统需求所建立的脚本,优先级比上面高,这里面也是放置开机启动脚本的link文件

    服务分类

    后缀名功能
    .service系统服务
    .socket用于IPC(Inter-process communication)的传输信息,一般用于唤醒其他服务
    .target用于执行一群服务的集合
    .mount / .automount挂载相关服务
    .path检查特定文件的服务,如打印服务
    .timer循环执行的服务

    利用systemctl管理服务

    命令 systemctl [command] service用于统一管理服务

    服务的开关

    • start / stop / restart:开/关/重启服务
    • reload:不关闭服务的情况下,重新载入设置文件
    • enalbe / disable:开机自启及取消
    • status:列出状态
    • is-active:判断是否在允许
    • is-enable:判断是否开机自启

    如下 atd.service 状态enable表示可开机自启,状态active(running)表示正在运行

    在这里插入图片描述

    强制注销服务

    如下,先关闭cup.service(该服务用于打印)

    在这里插入图片描述
    然后启动cup.socket

    在这里插入图片描述
    输出文字test用于打印,可看到cup.service被唤醒

    在这里插入图片描述

    服务具有相连性,cups.service会通过port 631来实现打印,但系统无需一直启动631端口,故多了一个cup.socket服务,这个服务用于监听端口,在用户有需要打印时会主动唤醒cups.service

    解决办法是将cup.socket和cups.service一同关闭,或使用命令 mask 将cups.service注销

    在这里插入图片描述
    如上,使用mask后,cups.service无法再启动,取消注销则为unmask

    服务的观察

    命令 systemctl 默认加参数 list-units 列出已启动的服务,–all列出未启动的服务,list-unit-files 依据/usr/lib/systemd/system的文件进行解释,–type列出指定类型服务
    在这里插入图片描述

    • UNIT:项目名称
    • LOAD:是否开机自启
    • ACTIVE SUB:状态
    • DESCRIPTION:描述

    操作界面相关服务

    systemd取消了原来执行等级的概念,转为使用不同的target操作环境

    • graphical.target:文件加图形界面
    • multi-user.target:文件界面
    • rescue.target:维护界面
    • emergency.target:救援界面,当上面无法使用时就用这个
    • shutdown.target:关机流程
    • getty.target:修改tty

    命令 get-default 获取当前target,set-default设置默认target,isolate切换模式

    在这里插入图片描述

    服务相关性

    命令 list-depencies即可列出当前服务的所使用的服务

    在这里插入图片描述
    如上可看到graphical.target用到multi-user.target,如下反向查找被哪些其他服务用到

    在这里插入图片描述

    服务介绍

    可通过man systemd.service查看更具体介绍

    在这里插入图片描述

    Unit说明服务用途和相关性等:

    • Description:说明
    • Documentation:查询文件
    • After:在某服务启动之后才启动此服务(非强制)
    • Before:在某服务启动前启动此服务(非强制)
    • Requires:在某服务启动之后才启动此服务(强制)
    • Wants:在某服务启动之前才启动此服务(非强制)
    • Conflicts:存在冲突的服务

    Service说明服务启动脚本、环境等:

    参数说明
    Typesimple:ExecStart指令启动并常驻内存
    forking:由fork启动
    oneshot:ExecStart指令启动但只执行一次
    EnvironmentFile指定启动脚本的环境配置文件
    ExecStart启动服务的指令或脚本
    ExecStop关闭服务的指令或脚本
    ExecReloadreload的指令或脚本
    Restart为1时服务停止后会再次启动,如tty登出后会再启动tty用于登入
    TimeoutSec服务无法正常启动或关闭时,等待多久进入强制结束状态
    RestartSec服务重启时间

    Install说明服务的target等:

    • WantedBy:后面接*.target,表示服务依附的target
    • Also:表示当服务被enable时,指定的服务也会enable
    • Alias:服务别名,如 systemctl set-default defalut.target相当于multi-user.target

    制作Service

    新建脚本backup.sh用于打包/etc

    在这里插入图片描述

    在/etc/systemd/system下新建back.service

    在这里插入图片描述

    接下来启动back.service,状态为inactive,因为脚本执行完并不会常驻内存,可看到生成了压缩包

    在这里插入图片描述

    制作timer

    systemctl的timer也可实现定时执行的功能,可在/etc/systemd/system 下自定义 *.timer

    参数意义
    OnActiveSectimers.targer启动多久后执行
    OnBootSec开机多久后执行
    OnStartupSecsystemd第一次启动多久后执行
    OnUnitActiveSec距离上一次启动多久后再执行
    OnUnitInactiveSec距离上一次停止多久后再执行
    OnCalendar使用实际时间启动,格式为week YYYY-MM-DD HH:MM:SS
    Unit如果 .service和 .timer的名称不一样则需指定service
    Persistent是否持续运行

    现需要:

    • 开机后2小时执行/backup.service
    • 距第一次执行后,未来每两天都要执行一次/backup.service

    在这里插入图片描述

    如下,只需要启动back.timer

    在这里插入图片描述

    如下

    • 上一次执行backup.service的时间为2022-07-30 11:42:16
    • 两天后执行backup.service的时间为2022-08-1 11:42:16
    • 减去timer.target的时间2022-7-30 11:27:38
    • 得2d 14min

    在这里插入图片描述

    如果使用OnCalendar指定时间,则NextElapseUSecRealtime为距1970-01-01 00:00:00的时间

  • 相关阅读:
    【C++】类的封装 ① ( 类和对象 | 面向对象三大特征 - 封装 继承 多态 | 类的封装引入 )
    笔记:在Entity Framework Core中使用乐观并发控制来处理数据更新的冲突
    Oracle 中排序碰到 null 值如何处理
    【C进阶】之存储类型及用户空间内部分布
    后端编译与优化(JIT,即时编译器)
    mySQL
    Spring Boot与Istio服务网格的整合实践
    SQL注入脚本编写
    软件项目管理---项目范围管理
    AQS层层剖析
  • 原文地址:https://blog.csdn.net/qq_35258036/article/details/125988751