# Linux 系统设置 systemctl

# 文件配置

这里以设置 redis 为例,其他的也是一样的

  1. 打开路径 /etc/systemd/system

    1
    cd /etc/systemd/system
  2. 使用 vim 编辑 redis.service,添加如下内容

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    [Unit]
    Description=Redis
    After=network.target

    [Service]
    Type=forking
    ExecStart=/usr/local/redis-stable/src/redis-server /usr/local/redis-stable/redis.conf
    ExecReload=/usr/local/redis-stable/src/redis-server -s reload
    ExecStop=/usr/local/redis-stable/src/redis-server -s stop
    PrivateTmp=true

    [Install]
    WantedBy=multi-user.target
  3. 重新读取 systemctl 文件:

    1
    systemctl daemon-reload
  4. 使用指令查看是否配置成功:

    1
    systemctl status redis

如果正常显示,那么就配置完成了,可以使用 start,stop,enable 等命令进行控制

# 文件内容解读

# Unit

Unit 主要是对该服务的说明,以及配置与其他服务的关系:

  • Description:对 Unit 的描述,通常为简短的一句话
  • After:指在什么运行之后执行,设置为 network.target 表示网络运行后启动
  • Before:与 After 相反
  • Documentation:指定服务的文档
  • Requires:依赖的其他 Unit 列表,列在其中的 Unit 模块会在这个服务启动的同时被启动,如果其中任意一个启动失败,则该服务也将被终止
  • Wants:与 Requires 类似,但只是在启动时调用其他 Unit 模块,不考虑被调用的模块是否启动成功
  • Conflicts:冲突模块,如果列出的模块已经运行,则该模块不能运行
  • OnFailure:当该模块启动失败时,启动 OnFailure 列出的模块
  • PartOf:该参数仅作用于单元的停止或重启。当停止或重启列出的某个 Unit 时,该 Unit 也会被停止。反之,当该 Unit 被停止时,并不影响该参数中的 Unit

# Service

Service 是服务 (Service) 类型的 Unit 文件 (后缀为.service) 特有的,用于定义服务的具体管理和执行操作:

  • Type:设置进程的启动类型。必须设置为 simple、exec、forking、oneshot、dbus、notify、idle 之一,默认为 simple 类型,适用于大多数场景。如果服务程序启动后会通过 fork 系统调用创建子进程,然后关闭应用程序本身进程的情况,则应该将 Type 的值设置为 forking,否则 systemd 将不会跟踪子进程的行为,而是认为服务已经退出。
  • Environment:为服务添加环境变量
  • EnvironmenFile:指定加载一个包含服务所需的环境参数的文件,文件中每一行都是一个环境变量的定义
  • ExecStart:指定服务启动的主要命令,每个配置文件中只能使用一次。需要使用绝对路径
  • ExecStartPre:指定在启动执行 ExecStart 的命令前的准备工作,可以有多个,所有命令会按照书写顺序依次执行
  • ExecStartPost:指定在启动执行 ExecStart 的命令后的收尾工作,也可以有多个
  • ExecStop:停止服务所需要执行的主要命令。需要使用绝对路径
  • ExecStopPost:指定在 ExecStop 命令执行后的收尾工作,也可以有多个
  • ExecReload:重新加载服务文件所需要执行的主要命令。需要使用绝对路径
  • Restart:这个值用于指定在什么情况下需要重启服务进程,如下表所示:
退出原因 no always on-success on-failure on-abnormal on-abort on-watchdog
正常退出 X X
退出码不为 "0" X X
进程被强制杀死 X X X X
systemd 操作超时 X X X
看门狗超时 X X X X
  • RestartSec:如果服务需要被重启,这个参数的值为服务被重启前的等待秒数。该参数仅在上述 Restart 自动重启的情况有效,如果是手动执行 systemctl restart 命令,则该参数无效。
  • Nice:服务的进程优先级,值越小优先级越高,默认为 0、-20 为最高优先级、19 为最低优先级
  • WorkingDirectory:指定服务的工作目录
  • RootDirectory:指定服务进程的根目录,如果配置了该参数,服务将无法访问指定目录以外的任何文件
  • User:指定运行服务的用户,会影响服务对本地文件系统的访问权限
  • Group:指定运行服务的用户组,会影响服务对本地文件系统的访问权限
  • PrivateTmp:是否给服务分配独立的临时空间(true/false)

# Install

Install 是服务的安装信息,它不再 systemd 的运行期间使用,只在使用 systemctl enablesystemctl disable 命令启用 / 禁用服务时有用,所有 Unit 文件通用,用来定义如何启动,以及是否开机启动:

  • WantedBy:它的值时一个或多个 target,执行 enable 命令时,符号链接会放入 /etc/systemd/system 目录下以 target 名 +.wants 后缀构成的子目录。 WantedBy=multi-user.target 表示当系统以多用户方式 (默认的运行级别) 启动时,这个服务需要被自动运行。需要用 systemctl enable 激活
  • RequireBy:依赖当前服务的模块。它的值时一个或多个 target,执行 enable 命令时,符号链接会放入 /etc/systemd/system 目录下以 target 名 +.required 后缀构成的子目录中
  • Alias:当前 Unit 可用于启动的别名
  • Also:当前 Unit 被 enable/disable 时,会被同时操作的其他 Unit