Please enable Javascript to view the contents

Linux基础-服务管理-实战

 ·  ☕ 5 分钟

Systemd相关文件

  • /usr/lib/systemd/system/xx.service 配置文件

命令举例

  1. 开机自启动
    1
    
    systemctl enable httpd
    
  2. 启动服务
    1
    
    systemctl start httpd
    
  3. 查看服务状态
    1
    
    systemctl status httpd
    
  4. 停止服务
    1
    
    systemctl stop httpd
    
  5. 加载配置文件
    1
    
    systemctl daemon-reload
    
  6. 重启服务
    1
    
    systemctl restart httpd
    
  7. 列出Target包含的服务
    1
    2
    
    # 查看 multi-user.target 包含的所有服务
    systemctl list-dependencies multi-user.target
    
  8. 切换Target
    1
    2
    3
    
    切换到另一个 target
    # shutdown.target 就是关机状态
    systemctl isolate shutdown.target
    
  9. 列出所有活动的,类型是service的单元(Unit)
    1
    
    systemctl list-units --type=service
    
  10. 列出所有配置文件
1
systemctl list-unit-files
  1. 列出所有配置文件, unit状态为enabled
1
systemctl list-unit-files --state=enabled

服务配置文件

配置文件所在目录:主要放在/usr/lib/systemd/system目录,也可能在/etc/systemd/system目录。
以配置文件sshd.service举例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
[Unit]
Description=OpenSSH server daemon
Documentation=man:sshd(8) man:sshd_config(5)
After=network.target sshd-keygen.service
Wants=sshd-keygen.service

[Service]
EnvironmentFile=/etc/sysconfig/sshd
ExecStart=/usr/sbin/sshd -D $OPTIONS
ExecReload=/bin/kill -HUP $MAINPID
Type=simple
KillMode=process
Restart=on-failure
RestartSec=42s

[Install]
WantedBy=multi-user.target

[Unit]区块: 启动顺序、依赖关系

Description: 给出当前服务的简单描述
Documentation: 给出文档位置

After: 表示如果network.targetsshd-keygen.service需要启动,那么当前服务sshd.service应该在它们之后启动。
Before: 定义服务应该在哪些服务之前启动。

After和Before字段只涉及启动顺序,不涉及依赖关系。

Wants: 设置弱依赖关系。比如Wants=sshd-keygen.service表示服务与sshd-keygen.service之间存在"弱依赖"关系,即如果sshd-keygen.service启动失败或停止运行,不影响当前服务继续执行。
Requires: 设置强依赖关系,即如果配置的服务启动失败或异常退出,那么当前也必须退出。

Wants字段与Requires字段只涉及依赖关系,与启动顺序无关。

[Service]区块:启动行为

Service区块定义如何启动当前服务。

  1. 启动命令
    EnvironmentFile:指定当前服务的环境参数文件。该文件内部的key=value键值对,可以用$key的形式,在当前配置文件中获取。
    ExecStart:定义启动进程时执行的命令(参数可用$key的形式,在EnvironmentFile配置的文件中获取)。
    ExecReload\ExecStop\ExecStartPre\ExecStartPost\ExecStopPost: 重启\停止\启动之前\启动之后\停止之后

    赋值是加连词号-,表示抑制错误,即发生错误时不影响其他命令执行。例如EnvironmentFile=-/etc/sysconfig/sshd
    ,当文件不存在时,不影响后续ExecStart执行

  2. 启动类型
    Type: 定义启动类型。

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

KillMode: 定义 Systemd 如何停止服务。

KillMode字段值说明
control-group(默认值)当前控制组里面的所有子进程,都会被杀掉
process只杀主进程
mixed主进程将收到 SIGTERM 信号,子进程收到 SIGKILL 信号
none没有进程会被杀掉,只是执行服务的 stop 命令

Restart: 定义了服务退出后,Systemd 的重启方式。

守护进程,推荐设置on-failure; 允许发生错误退出的服务,可设置on-abnormal

Restart字段值说明
no(默认值)退出后不会重启
on-success只有正常退出时(退出状态码为0), 才会重启
on-failure非正常退出时(退出状态码非0), 包括被信号终止和超时, 才会重启
on-abnormal只有被信号终止和超时,才会重启
on-abort只有在收到没有捕捉到的信号终止时,才会重启
on-watchdog超时退出,才会重启
always不管是什么退出原因,总是重启

RestartSec字段:表示 Systemd 重启服务之前,需要等待的秒数。

[Install]区块

定义如何安装当前配置文件,即systemctl enable命令执行时,将当前配置文件拷贝至哪里(/etc/systemd/system/[Target|WantedBy设置].wants/)。

WantedBy字段:表示该服务所在的 Target。例如WantedBy=multi-user.target指的是,服务所在的Target是multi-user.target。

这个设置非常重要,因为执行systemctl enable sshd.service命令时,sshd.service的一个符号链接,就会放在/etc/systemd/system目录下面的multi-user.target.wants子目录之中。

Target

Target: 表示一组服务。Systemd默认的启动Target是multi-user.target。在这个组里的所有服务,都将开机启动。
可执行命令查看

1
systemctl get-default

一般来说,常用的 Target 有两个:一个是multi-user.target,表示多用户命令行状态;另一个是graphical.target,表示图形用户状态,它依赖于multi-user.target。官方文档有一张非常清晰的 Target 依赖

multi-user.target配置文件内容如下:

1
2
3
4
5
6
7
[Unit]
Description=Multi-User System
Documentation=man:systemd.special(7)
Requires=basic.target
Conflicts=rescue.service rescue.target
After=basic.target rescue.service rescue.target
AllowIsolate=yes

Requires:要求basic.target一起运行。
Conflicts:冲突字段。如果rescue.servicerescue.target正在运行,multi-user.target就不能运行,反之亦然。
After:表示multi-user.targetbasic.target rescue.service rescue.target之后启动,如果它们有启动的话。
AllowIsolate:允许使用systemctl isolate命令切换到当前Targetmulti-user.target

分享

Hex
作者
Hex
CloudNative Developer

目录