SuperAPI AI 工具集

systemd

部署与运维

查看项目

更新于 10-15 07:49

技能介绍

本技能面向 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 的定时任务、按需的套接字激活服务、多实例模板服务以及服务的安全加固与故障排查。

限制

本资料未提供授权、收费、价格、平台支持范围或性能效果方面的信息,暂未提供。所有配置均以示例形式给出,实际使用需结合具体环境验证。