• linux进阶55——service文件


    实现流程

    创建.service文件

    创建ping@.service文件,内容可以如下:

    [Unit]
    Description=ping daemon
    After=network.target 
    
    [Service]
    Restart=on-failure
    ExecStart=/usr/bin/ping 127.0.0.%d
    ExecReload=/bin/kill -s -HUP $MAINPID               
    ExecStop=/bin/kill -s QUIT $MAINPID
    PrivateTmp=true
    KillMode=none                  
    LimitCORE=infinity
    
    [Install]
    WantedBy=multi-user.target 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    文件迁移

    将.service文件拷贝至/usr/lib/systemd/system/下

    cp ping@.service /usr/lib/systemd/system/
    
    • 1

    加载配置

    systemctl daemon-reload
    
    • 1

    调用服务

    # 启动服务
    systemctl start ping@1
    
    # 查看服务进程
    ps –aux | grep ping
    
    • 1
    • 2
    • 3
    • 4
    • 5

    systemctl

    概念

    systemctl是一个systemd工具,负责控制systemd系统和管理系统服务。

    命令

    #当新增或修改service单元文件时,需要系统重新加载所有修改过的配置文件
    systemctl daemon-reload
    
    #设置为开机自启动
    systemctl enable RegisterCenter
    
    #关掉开机启用
    systemctl disable RegisterCenter
    
    #启动服务
    systemctl start RegisterCenter
    
    #重启服务,相当于先stop,再start
    systemctl restart RegisterCenter
    
    #关闭服务,关闭服务后,进程会全部被kill掉
    systemctl stop RegisterCenter
    
    #查看服务的状态
    systemctl status RegisterCenter
    
    #查看服务是否开机启动
    systemctl is-enabled RegisterCenter
    
    #查看已启动的服务列表
    systemctl list-unit-files|grep enabled
    #
    显示所有已启动的服务
    systemctl list-units --type=service
    
    #查看启动失败的服务列表
    systemctl --failed
    
    # 杀死一个服务的所有子进程
    systemctl kill RegisterCenter
    
    # 重新加载一个服务的配置文件
    systemctl reload RegisterCenter
    
    #移除标记为丢失的 Unit 文件。在删除 Unit 文件后,由于缓存的关系,
    #即使通过 daemon-reload 更新了缓存,在 list-units 中依然会显示标记为 not-found 的 Unit
    systemctl reset-failed RegisterCenter
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42

    service文件组成

    控制单元(Unit)

    主要包括服务描述、启动顺序和依赖关系。

    • Description:当前服务的简单描述;
    • Documentation:文档位置;
    • After:在什么服务之后启动;
    • Before:在什么服务之前启动;
    说明:After和Before字段只涉及启动顺序,不涉及依赖关系。
    
    • 1
    • Wants:表示“弱依赖”关系。某服务停止运行或退出不影响该服务继续运行;
    • Requires:表示”强依赖”关系。列在其中的Uint模块会在这个服务启动的同时被启动,如果其中任意一个启动失败,这个服务会被终止。某服务停止运行或退出,该服务也必须停止运行。
    说明:Wants字段与Requires字段只涉及依赖关系,与启动顺序无关,默认情况下是同时启动的。
    
    • 1
    • PartOf:该参数仅用于单元的停止或重启。

    服务定义(service)

    Type

    定义启动类型。可设置的值如下:

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

    Environment

    为服务设置环境变量

    EnvironmentFile

    加载包含服务所需环境变量参数的文件。

    PIDFile

    该服务PID文件的路径(一般位于 /run/ 目录下)。 建议在 Type=forking 的情况下明确设置此选项。 如果设为相对路径,那么表示相对于 /run/ 目录。 systemd 将会在此服务启动完成之后,从此文件中读取主服务进程的PID 。 systemd 不会写入此文件,但会在此服务停止后删除它(若仍然存在)。

    ExecStart

    启动程序时执行的命令。例如:

    # %d为启动时需要传入的参数
    ExecStart=/usr/bin/ping 127.0.0.%d
    
    • 1
    • 2

    ExecReload

    重启服务执行的命令。例如:

    ExecReload=/bin/kill -s -HUP $MAINPID  
    
    • 1

    表示终止主进程且不产生core dump,重启服务。

    ExecStop

    通知服务时执行的命令。例如:

    ExecStop=/bin/kill -s QUIT $MAINPID
    
    • 1

    表示中断退出的方式终止进程且产生core dump,停止服务。

    ExecStartPre

    启动服务之前执行的命令。

    ExecStartPost

    启动服务之后执行的命令。

    ExecStopPost

    停止服务之后执行的命令。

    KillMode

    定义systemd如何停止sshd服务。设置值如下:

    l control-group(默认值):当前控制组里面的所有子进程,都会被杀掉;

    l process:只杀主进程;

    l mixed:主进程将收到 SIGTERM 信号,子进程收到 SIGKILL 信号;

    l none:没有进程会被杀掉,只是执行服务的 stop 命令;

    Restart

    定义sshd退出后,systemd的重启方式。设置值如下:

    • no(默认值):退出后不会重启;
    • on-success:只有正常退出时(退出状态码为0),才会重启;
    • on-failure:非正常退出时(退出状态码非0),包括被信号终止和超时,才会重启;
    • on-abnormal:只有被信号终止和超时,才会重启;
    • on-abort:只有在收到没有捕捉到的信号终止时,才会重启;
    • on-watchdog:超时退出,才会重启;
    • always:不管是什么退出原因,总是重启;
    说明:对于守护进程,推荐设为on-failure。对于那些允许发生错误退出的服务,可以设为on-abnormal。
    
    • 1

    服务出现情况与重启对应表

    退出原因/设置值noalwayson-successon-failureon-abnormalon-aborton-watchdog
    正常退出
    退出码不为0
    进程被强制杀死
    操作超时
    看门狗超时

    SuccessExitStatus

    额外定义其他的进程"正常退出"状态。 也就是,在退出码"0"、以及表示"正常退出"的 SIGHUP, SIGINT, SIGTERM, SIGPIPE 信号之外, 再额外添加一组表示"正常退出"的退出码或信号。 可以设为一系列以空格分隔的数字退出码或者信号名称, 例如:

    SuccessExitStatus=1 2 8 SIGKILL

    表示当进程的退出码是 1, 2, 8 或被 SIGKILL 信号终止时, 都可以视为"正常退出"。

    如果多次使用此选项, 那么最终的结果将是多个列表的合并。 如果将此选项设为空, 那么先前设置的列表 将被清空。

    RestartSec

    重启服务之前需要等待的秒数。

    WorkingDirectory

    指定服务工作目录

    User

    指定运行服务的用户。

    PrivateTmp

    设置true表示在进程的文件系统名字空间中挂载私有的/tmp和/var/tmp目录,也就是不与名字空间外的其他进程共享临时目录。这样做会增加进程的临时文件安全性,但同时也让进程之间无法通过/tmp或/var/tmp目录进行通信。

    安装部分(Install)

    用来定义如何启动以及是否开机启动。

    WantedBy

    表示该服务所在的Target。 Target的含义是服务组,表示一组服务。“WantedBy=multi-user.target”指的是服务所在的Target是multi-user.target。

    multi-user.target是systemd默认启动的Target,表示在这个组里的所有服务,都开机启动。

    RequiredBy

    依赖当前服务的模块。它的值是一个或多个 target,执行enable命令时,符号链接会放入/etc/systemd/system目录下以 target 名 + .required后缀构成的子目录中。

    Alias

    当前Unit可用于启动的别名。

    Also

    当前 Unit 被 enable/disable 时,会被同时操作的其他 Unit

    Target

    概念

    Target 就是一个 Unit 组,包含许多相关的 Unit 。启动某个 Target 的时候,Systemd 就会启动里面所有的 Unit。

    命令

    # 查看当前系统的所有 Target
    $ systemctl list-unit-files --type=target
    
    # 查看一个 Target 包含的所有 Unit
    $ systemctl list-dependencies multi-user.target
    
    # 查看启动时的默认 Target
    $ systemctl get-default
    
    # 设置启动时的默认 Target
    $ systemctl set-default multi-user.target
    
    # 切换 Target 时,默认不关闭前一个 Target 启动的进程,systemctl isolate 命令改变这种行为,关闭前一个 Target 里面所有不属于后一个 Target 的进程
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    启动流程

    • 读入 /boot 目录下的内核文件;
    • 内核文件加载完之后,开始执行第一个程序/sbin/init 初始化进程,由 Systemd 初始化系统引导,完成相关的初始化工作;
    • Systemd 执行default.target ,获知设定的启动 target (查看默认 target: systemctl get-default);
    • Systemd 执行启动 target 对应的单元文件。根据单元文件中定义的[依赖关系](bootup Manager Bootup),传递控制权,依次执行其他 target 单元文件,同时启动每个 target 包含的单元

    systemd中文文档可参考:http://www.jinbuguo.com/systemd/systemd.service.html#

  • 相关阅读:
    docker-容器相关:运行、启动、停止、进入、导出和导入、删除
    启动solr报错The stack size specified is too small,Specify at least 328k
    mmsegmentation 训练自己的数据集
    项目总结(制作报表)
    【C++PCL】点云处理点云密度计算优化
    前端面试中Vue的有经典面试题一
    Mysql架构 MMM与MHA区别
    SQLServer下载安装详细图解
    Go指针探秘:深入理解内存与安全性
    c++ 区分接口继承和实现继承
  • 原文地址:https://blog.csdn.net/www_dong/article/details/128026839