• rhel7 系统服务——unit(单元)


    Linux内核版本从3.10后开始使用systemd管理服务,这也是系统开机后的第一个服务。systemd通过unit单元文件来管理服务。

    它保存了服务、设备、挂载点和操作系统其他信息的配置文件,并能够处理不同单元之间的依赖关系。大部分单元都静态的定义在单元文件中,也有一些是动态生成的。单元有多种状态:

    • 处于活动的则是(active),当前正在运行

    • 停止的则是(inactive),当前已经停止

    • 启动中的则是(activing),当前正在启动

    • 停止中的则是(deactiving),当前正在停止

    • 失败的则是(failed)状态,意思说单元启动过程中遇到错误比如找不到文件、路径或者进程运行中崩溃了等。

    单元类型如下:

    单元类型 说明
    service单元 用于封装一个后台服务进程,比如通过systemctl start firewalld启动防火墙,这种就属于service单元。
    socket单元 用于封装一个后台服务进程,比如通过systemctl start firewalld启动防火墙,这种就属于service单元。
    target单元 用于将多个单元在逻辑上组合在一起让它们同时启动。
    device单元 用于封装一个设备文件,可用于基于设备启动。并不是每一个设备文件都需要一个device单元,但是每一个被udev规则标记的设备都必须作为一个device单元出现。
    mount单元 用于封装一个文件系统挂载点(向后兼容/etc/fstab)
    automount单元 用于封装一个文件系统自动挂载点,只有该文件系统被访问时才会进行挂载,它取代了传统的autofs服务。
    timer单元 用于封装一个基于时间触发的动作,它取代了atd、crond等计划任务。
    swap单元 用于封装一个交换分区或者交换文件,它与mount类似。
    path单元 用于根据文件系统上特定对象的变化来启动其他服务。
    slice单元 用于控制特定的CGroup内所有进程的总体资源占有。
    scope单元 它与service单元类似,但是由systemd根据D-bus接口接收到的信息自动创建,可用于管理外部创建的进程。

    systemd能够处理各种依赖与冲突关系以及先后顺序,依赖与冲突、先后顺序两者之间是独立的。比如service1依赖service2,而且启动service1必须先启动service2,,那么这2个服务将会同时启动。

     

    系统提供两种级别的单元:

    • 系统单元:在/lib/systemd/system目录中,优先级高于用户单元。

    • 用户单元:在/usr/lib/systemd/system目录中

    查看所有系统单元

    1 [root@jenkins mongodb]# systemctl list-unit-files
    2 UNIT FILE                                     STATE   
    3 proc-sys-fs-binfmt_misc.automount             static  
    4 dev-hugepages.mount                           static  
    5 dev-mqueue.mount                              static  

    service文件说明

    1、[unit]段:

    设置管理启动顺序与依赖关系

    Description=服务描述 给出当前服务的简单描述                                              
    Documentation=路径或url 给出文档位置
    After=服务.target或服务.service           

    定义在某些服务之后启动。例如sshd服务启动必须在network.target sshd-keygen.service服务开启之后才能启动,可以使用如下命令查看sshd服务的配置

    cat  /usr/lib/systemd/system/sshd.service

    Before=服务.target 定义在某些服务之前启动
    Wants=服务.service 弱依赖,表示等号填写服务启动或失败,不影响此配置文件服务的启动
    Requires=服务.service 设置此单元所必须依赖的其他单元。 当此单元被启动时,所有这里列出的其他单元也必须被启动。 如果有某个单元未能成功启动,那么此单元也不会被启动。 想要添加多个单元, 可以多次使用此选项, 也可以设置一个空格分隔的单元列表。 注意,此选项并不影响单元之间的启动或停止顺序。 想要调整单元之间的启动或停止顺序, 请使用 After= 或 Before= 选项。 例如,在 foo.service 中设置了 Requires=bar.service 但是并未使用 After= 或 Before= 设定两者的启动顺序, 那么,当需要启动 foo.service 的时候, 这两个单元会被并行的同时启动。 建议使用 Wants= 代替 Requires= 来设置单元之间的非致命依赖关系, 从而有助于获得更好的健壮性, 特别是在某些单元启动失败的时候。

    2、[Install] 段:

    这个段包含单元启动信息,只有单元状态为enable或者disabled才会用到这个段,这个段不能出现在单元的.d/*.conf配置文件中。

    字段 说明
    Alias= 启用时使用的别名,可以设为一个空格分隔的别名列表。 每个别名的后缀(也就是单元类型)都必须与该单元自身的后缀相同。 如果多次使用此选项,那么每个选项所设置的别名都会被添加到别名列表中。 在启用此单元时,systemctl enable 命令将会为每个别名创建一个指向该单元文件的软连接。 注意,因为 mount, slice, swap, automount 单元不支持别名,所以不要在这些类型的单元中使用此选项。

    WantedBy=

    RequiredBy=

    接受一个空格分隔的单元列表, 表示在使用 systemctl enable 启用此单元时, 将会在每个列表单元的 .wants/ 或 .requires/ 目录中创建一个指向该单元文件的软连接。 这相当于为每个列表中的单元文件添加了 Wants=此单元 或 Requires=此单元 选项。 这样当列表中的任意一个单元启动时,该单元都会被启动。 有关 Wants= 与 Requires= 的详细说明, 参见前面 [Unit] 小节的说明。 如果多次使用此选项,那么每个选项的单元列表都会合并在一起。

    这个选项跟启动级别有关,通常设置的值为mult-user.targe 这是一个target,之后再讲,你只需要知道这相当于启动级别中的多用户默认。

    Also=

    设置此单元的附属单元,可以设为一个空格分隔的单元列表。 表示当使用 systemctl enable 启用 或 systemctl disable 停用 此单元时, 也同时自动的启用或停用附属单元。如果多次使用此选项, 那么每个选项所设置的附属单元列表都会合并在一起。

    DefaultInstance= 仅对模板单元有意义, 用于指定默认的实例名称。 如果启用此单元时没有指定实例名称, 那么将使用这里设置的名称。

    [Service]:设置启动行为

    启动命令

    字段         说明
    ExecStart=命令 定义启动进程时执行的命令
    ExecReload=命令                                                                                重启服务时执行的命令                                                                                                                                                      
    ExecStop=命令 停止服务时执行的命令
    ExecStartPre=命令 启动服务之前执行的命令
    ExecStartPost=命令 启动服务之后执行的命令
    ExecStopPost=命令 停止服务之后执行的命令

    所有的启动设置之前,都可以加上一个连词号(-),表示"抑制错误",即发生错误的时候,不影响其他命令的执行。例如:ExecStop=-/bin/sh /server/scripts/xx.sh

    启动类型  Type字段定义启动类型。它可以设置的值如下:

    simple(默认值) ExecStart字段启动的进程为主进程
    forking ExecStart字段将以fork()方式启动,此时父进程将会退出,子进程将成为主进程(后台运行)
    oneshot 类似于simple,但只执行一次,Systemd 会等它执行完,才启动其他服务
    dbus 类似于simple,但会等待 D-Bus 信号后启动
    notify 类似于simple,启动结束后会发出通知信号,然后 Systemd 再启动其他服务
    idl 类似于simple,但是要等到其他任务都执行完,才会启动该服务。一种使用场合是为让该服务的输出,不与其他服务的输出相混合


    service的其他一些字段

    EnvironmentFile=文件路径 指定当前服务的环境参数文件
    RestartSec=数值 表示Systemd重启服务之前,需要等待的秒数
    PIDFile=PID文件路径 PID进程文件
    KillSignal=信号量 停止信号量,值一般为SIGQUIT
    TimeoutStopSec=数值 停止超时时间
    PrivateTmp=布尔值 独立空间true或false,即文件系统名字空间的配置将被该命令行启动的进程忽略

    [Install]:定义如何安装这个配置文件,即怎样做到开机启动

    这个设置非常重要,如果设置开机自启动,在/etc/systemd/system目录下面的multi-user.target.wants子目录之中机会创建一个服务的软链接

    WantedBy字段,表示该服务所在的 Targe,target的含义是服务组,表示一组服务,它可以设置的值如下

    multi-user.target 表示多用户命令行状态
    graphical.target 表示图形用户状态,它依赖于multi-user.target        

    一个MongoDB的示例

    [root@jenkins mongodb]# vim /usr/lib/systemd/system/mongod.service
    [Unit]
    Description="mongodb启动服务"
    After=network.target remote-fs.target nss-lookup.target
    
    [Service]
    Type=forking
    ExecStart=/data/module/mongodb/bin/mongod --config /data/module/mongodb/mongo.conf
    ExecReload=/bin/kill -s HUP $MAINPID
    ExecStop=/data/module/mongodb/bin/mongod --shutdown --config /data/module/mongodb/mongo.conf
    PrivateTmp=true
    
    [Install]
    WantedBy=multi-user.target
  • 相关阅读:
    反射
    特性(Attribute)
    简单了解Ado.net(下)
    幸福不会来敲门
    C#网络编程之服务客户模式在控制台下的简单交互
    简单了解Ado.net(上)
    简单实体框架
    自己动手写泛型List<T>
    opencv学习之路(1)
    C语言学习之文件操作(含重庆大学研究生程序设计大赛的题目和解答)
  • 原文地址:https://www.cnblogs.com/zh-dream/p/12336421.html
Copyright © 2020-2023  润新知