Systemd(Systemctl)系统管理服务脚本编写教程

简介

systemd作为系统启动方式,每一个服务以.service结尾,一般会分为3部分:Unit、Service和Install

Unit部分

服务的说明内容, 文档介绍以及对一些依赖服务定义

  • Description 简单描述服务
  • After 在什么服务启动之后
  • Before 在什么服务启动之前启动
  • Requires 依赖其他的单元服务, 需要与列出的服务一起激活,若任何服务无法启动,则该单元不会被激活
  • Wants 比Requires依赖性弱,弱其他服务没有启动成功,该服务也不受影响,只是表示一种推荐

Service部分

服务的一些具体运行参数的设置

  • Type
    • simple:ExecStart字段启动的进程为主进程(默认)
    • forking: ExecStart字段以fork方式启动,此时父进程将退出,子进程将成为主进程(后台运行),一般都设置为forking
    • oneshot: 类似于simple,但只执行一次,systemd会等它执行完,才启动其他服务
    • dbus:类似于simple, 但会等待D-Bus信号后启动
    • notify: 类似于simple, 启动结束后会发出通知信号,然后systemd再启动其他服务
    • idle:类似于simple,但是要等到其他任务都执行完,才会启动该服务
  • EnvironmentFile:指定配置文件,和连词号(-)组合使用,,表示抑制错误,即发生错误时,不影响其他命令的执行。eg:EnviromentFile=-/etc/sysconfig/xxx 表示即使文件不存在,也不会抛异常
  • Environment: 后面接多个不同的shell变量。eg:Environment=DATA_DIR=/data/elk
  • KillMode:
    • control-group:当前控制组里的所有子进程,都会被杀掉(默认)
    • process: 只杀主进程
    • mixed: 主进程将收到SIGTERM信号,子进程收到SIGKILL信号
    • none: 没有进程会被杀掉,只是执行服务的stop命令
  • Restart的类型:
    • no(默认值):退出后无操作
    • on-success: 只有正常退出时(退出状态码为0),才会重启
    • on-failure: 非正常退出时,重启,包括被信号终止和超时等,对于守护进程,推荐用on-failure
    • on-abnormal:只有被信号终止或超时,才会重启
    • on-abort:只有在收到没有捕捉到的信号终止时,才会重启
    • on-watchdog: 超时退出时,才会重启
    • always: 不管什么退出原因,都会重启
  • WantedBy:
    • multi-user.target: 表示多用户命令行状态,这个设置很重要,一般设置为multi-user.target
    • graphical.target: 表示图形用户状体,它依赖于multi-user.target
  • PIDFile:PID的文件路径
  • PrivateTmp:是否分配独立的临时空间
  • ExecStart:启动服务时执行的命令
  • ExecReload:重启服务时执行的命令
  • ExecStop:停止服务时执行的命令
  • ExecStartPre:启动服务前执行的命令
  • ExecStartPost:启动服务后执行的命令
  • ExecStopPost:停止服务后执行的命令
  • StartLimitInterval: 无限次重启,默认是10秒内如果重启超过5次则不再重启,设置为0表示不限次数重启
  • RestartSec:表示systemd重启服务之前,需要等待的秒数:RestartSec: 30 ,默认值0.1(s)
    注意:启动、重启、停止命令全部要求使用绝对路径,使用相对路径则会报错!

    服务保存位置

    脚本的权限为754,脚本一般存放在/usr/lib/systemd中 , 目录下又有user和system之分
  • /usr/lib/systemd/system :系统服务,开机不需要登录就能运行的程序(相当于开机自启)
  • /usr/lib/systemd/user:用户服务,需要登录后才能运行的程序

    systemctl命令用法

    systemctl start [服务名(也是文件名)]
    systemctl restart [服务名(也是文件名)]
    systemctl stop [服务名(也是文件名)]
    systemctl status [服务名(也是文件名)]
    systemctl enable [服务名(也是文件名)]
    systemctl disable [服务名(也是文件名)]

    举例

    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
    [Unit]
    Description=Docker Application Container Engine
    Documentation=http://docs.docker.com
    After=network.target
    Wants=docker-storage-setup.service
    Requires=docker-cleanup.timer

    [Service]
    Type=notify
    NotifyAccess=main
    EnvironmentFile=-/run/containers/registries.conf
    EnvironmentFile=-/etc/sysconfig/docker
    EnvironmentFile=-/etc/sysconfig/docker-storage
    EnvironmentFile=-/etc/sysconfig/docker-network
    Environment=GOTRACEBACK=crash
    Environment=DOCKER_HTTP_HOST_COMPAT=1
    Environment=PATH=/usr/libexec/docker:/usr/bin:/usr/sbin
    ExecStart=/usr/bin/dockerd-current \
    --add-runtime docker-runc=/usr/libexec/docker/docker-runc-current \
    --default-runtime=docker-runc \
    --exec-opt native.cgroupdriver=systemd \
    --userland-proxy-path=/usr/libexec/docker/docker-proxy-current \
    --init-path=/usr/libexec/docker/docker-init-current \
    --seccomp-profile=/etc/docker/seccomp.json \
    $OPTIONS \
    $DOCKER_STORAGE_OPTIONS \
    $DOCKER_NETWORK_OPTIONS \
    $ADD_REGISTRY \
    $BLOCK_REGISTRY \
    $INSECURE_REGISTRY \
    $REGISTRIES
    ExecReload=/bin/kill -s HUP $MAINPID
    LimitNOFILE=1048576
    LimitNPROC=1048576
    LimitCORE=infinity
    TimeoutStartSec=0
    Restart=on-abnormal
    KillMode=process

    [Install]
    WantedBy=multi-user.target

    相关文档

    https://www.ibm.com/developerworks/cn/linux/1407_liuming_init3/index.html
    https://wizardforcel.gitbooks.io/vbird-linux-basic-4e/content/150.html