本技能面向 Linux 平台上的 systemd 服务管理,内容以 systemctl 命令、unit 单元文件结构以及相关配套机制为主,可用于编写、调试和加固长期运行的应用程序服务。
用途
systemd 是 Linux 的服务与初始化系统。本技能文档用于处理服务管理、单元文件(unit file)、定时器(timer)和 journal 日志记录等任务,适用于用户提到 systemd、systemctl、service file、unit file 等场景。
主要能力
systemctl 命令
文档列出常用的服务生命周期命令,包括 start、stop、restart、reload、enable(可配合 --now 立即启动)、disable,以及状态查询命令 status、is-active、is-enabled,和查看运行指标的 show -p MainPID,MemoryCurrent。编辑单元文件后需执行 systemctl daemon-reload 重新加载。此外还列出失败服务查看、单元文件列表、定时器列表等命令。
单元文件编写
系统服务放在 /etc/systemd/system/myapp.service。文档给出 [Unit]、[Service]、[Install] 各段落示例,包含 Description、After、Wants、Type、User、Group、WorkingDirectory、ExecStart、ExecReload、Restart、RestartSec、StandardOutput、StandardError、SyslogIdentifier、WantedBy 等字段,并说明创建或编辑后需 daemon-reload 并 enable --now。
服务类型
文档以表格对比 simple(默认,ExecStart 进程即主进程)、forking(进程 fork 后父进程退出,需设置 PIDFile)、oneshot(运行后退出,适合安装脚本与迁移)、notify(类似 simple,但就绪时发送 sd_notify)、idle(等待其他任务完成后启动)等类型的行为与适用场景,并给出 forking 与 oneshot 的配置示例(oneshot 可配合 RemainAfterExit=yes)。
环境变量
可通过 Environment= 直接设置,也可通过 EnvironmentFile= 引入文件;在文件路径前加短横线表示文件缺失时不报错。环境文件格式为每行一个 VAR=VALUE。
重启策略与限流
文档以表格对比 no、on-failure、on-abnormal、always 在不同退出情形下的重启行为,并给出 RestartSec、StartLimitIntervalSec、StartLimitBurst 的配置示例。重置失败状态使用 systemctl reset-failed。
资源限制
包含 MemoryMax、MemoryHigh(硬限制前先节流)、CPUQuota、CPUWeight、LimitNOFILE、LimitNPROC 等配置项示例。
依赖管理
区分仅排序(After、Before)与拉入依赖(Requires 为硬依赖、Wants 为软依赖、BindsTo 在依赖停止时一并停止),并说明需要真实网络连通性时应使用 network-online.target。
用户级服务
用户单元放在 ~/.config/systemd/user/,无需 root,通过 systemctl --user 管理,日志用 journalctl --user 查看。可用 loginctl enable-linger 让服务在无登录会话时也运行;%h 展开为用户主目录。
定时器
作为 cron 的替代方案,文档给出 .timer 与配套 .service 的示例,包含 OnCalendar、Persistent(补跑错过的执行)、RandomizedDelaySec,以及相对启动时间的 OnBootSec、OnUnitActiveSec。列出 hourly、daily、weekly 及具体日历表达式的写法,并说明可用 systemd-analyze calendar 验证。
journalctl 日志查询
涵盖跟踪(-f)、行数(-n)、时间范围(--since/--until)、优先级(-p)、当前启动(-b)、JSON 输出(-o json-pretty、配合 jq)、内核日志(-k),以及磁盘占用查看与按大小、时间清理日志的命令。
套接字激活
服务可在连接到达时按需启动。文档给出 .socket 与 .service 的配置示例,说明服务以 fd 3 接收套接字(SD_LISTEN_FDS_START),并提示应启用 socket 而非 service。
模板单元
模板文件名含 @,实例名为 %i。文档给出 myapp@.service 示例,并以 enable --now myapp@8080、myapp@8081 展示多实例启用方式。
常见服务配置范例
文档提供 Node.js、Python(uvicorn 配合 venv)、Go 二进制、Docker 容器四类配置示例;其中 Docker 示例使用 ExecStartPre 前加短横线表示容器不存在时不报错,并提示所有模式都需要 After=network.target 与 WantedBy=multi-user.target。
故障排查
列出 status、journalctl -xeu、完整启动日志、systemd-analyze blame、critical-chain、verify(校验语法)、security(安全评分)等命令,并解释常见退出码:200 为单元文件语法错误、203 为 exec 格式错误(缺少 shebang 或架构不符)、217 为用户或组不存在。
安全加固
给出 ProtectSystem、ProtectHome、ReadWritePaths、PrivateTmp、NoNewPrivileges、PrivateDevices、ProtectKernelTunables/Modules/Logs、ProtectControlGroups、RestrictAddressFamilies、SystemCallFilter、SystemCallArchitectures 等配置项,以及 DynamicUser 与 StateDirectory/CacheDirectory/LogsDirectory 自动建目录的用法,还包含通过 CapabilityBoundingSet 与 AmbientCapabilities 绑定 1024 以下端口的写法。安全审计用 systemd-analyze security(0 最安全,10 最不安全)。
Path 单元
可监视文件变化触发服务,包含 PathChanged、PathExists、PathModified 与 Unit= 指定目标服务。
说明符速查
文档末尾列出常用说明符:%i 实例名、%I 未转义实例名、%n 完整单元名、%h 用户主目录、%t 运行时目录、%S 状态目录、%C 缓存目录。
使用方式
按文档提供的方式创建或编辑 unit 文件后,需执行 daemon-reload,再进行启用或启动。用户级服务使用 systemctl --user 前缀;定时器需同时准备 .timer 与 .service;日志统一通过 journalctl 查询。
适用场景
适合在 Linux 上部署长期运行的应用服务、替代 cron 的定时任务、按需的套接字激活服务、多实例模板服务以及服务的安全加固与故障排查。
限制
本资料未提供授权、收费、价格、平台支持范围或性能效果方面的信息,暂未提供。所有配置均以示例形式给出,实际使用需结合具体环境验证。