Linux 系统资源管理 | 资源配置文件

发布时间 2023-07-10 17:21:39作者: 菜乌

新 Linux 系统中,使用 systemd 管理所有系统资源

所有资源成为 unit,每一个 unit 都有一个配置文件

有时候我们需要创建或修改 unit 的配置文件


配置文件可以用文本编辑器打开,比如 vim。

也可以用命令 systemctl cat nginx.service

# systemctl cat nginx.service

[Unit]
Description=nginx
After=network.target

[Service]
Type=forking
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s quit
PrivateTmp=true

[Install]
WantedBy=multi-user.target

[Unit]

用来定义 Unit 的元数据,以及配置与其他 Unit 的关系

有以下参数:

  • Description:资源描述

  • Documentation:文档地址

  • Requires:当前 Unit 依赖的其他 Unit,如果它们没有运行,当前 Unit 会启动失败

  • Wants:与当前 Unit 配合的其他 Unit,如果它们没有运行,当前 Unit 不会启动失败

  • BindsTo:它指定的 Unit 如果退出,会导致当前 Unit 停止运行

  • Before:如果该字段指定的 Unit 也要启动,那么必须在当前 Unit 之后启动

  • After:如果该字段指定的 Unit 也要启动,那么必须在当前 Unit 之前启动

  • Conflicts:这里指定的 Unit 不能与当前 Unit 同时运行

  • Condition...:当前 Unit 运行必须满足的条件,否则不会运行

  • Assert...:当前 Unit 运行必须满足的条件,否则会报启动失败


[Service]

用来 service 的配置,只有服务资源有这个模块

  • Type:定义启动时的进程行为

    • Type=simple:默认值,启动主进程

    • Type=forking:以 fork 方式从父进程创建子进程,创建后父进程会立即退出

    • Type=oneshot:一次性进程,Systemd 会等当前服务退出,再继续往下执行

    • Type=dbus:当前服务通过 D-Bus 启动

    • Type=notify:当前服务启动完毕,会通知 Systemd,再继续往下执行

    • Type=idle:若有其他任务执行完毕,当前服务才会运行

  • ExecStart:启动命令

  • ExecStartPre:启动服务之前执行的命令

  • ExecStartPost:启动服务之后执行的命令

  • ExecReload:重新加载服务的命令

  • ExecStop:停止服务的命令

  • ExecStopPost:停止当其服务之后执行的命令

  • RestartSec:自动重启当前服务间隔的秒数

  • Restart:定义何种情况 Systemd 会自动重启当前服务,可能的值包括:

    • always

    • on-success

    • on-failure

    • on-abnormal

    • on-abort

    • on-watchdog

  • TimeoutSec:定义 Systemd 停止当前服务之前等待的秒数

  • Environment:指定环境变量


[Install]

用来定义启动方式

  • WantedBy:一个或多个 Target,Unit 软链接会放入 /etc/systemd/system 目录下面以 Target 名 + .wants 后缀构成的子目录中

  • RequiredBy:一个或多个 Target,Unit 软链接会放入 /etc/systemd/system 目录下面以 Target 名 + .required 后缀构成的子目录中

  • Alias:Unit 可用于启动的别名

  • Also:Unit 激活(enable)时,会被同时激活的其他 Unit


配置文件中设置的 target,相当于一个 unit 组

启动某个 target,相当于启动了组内所有的 unit

target 也可以用 systemctl 查看

  • 查看所有 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