systemd服务启动、重载与开机自启
systemd的“已启用”和“正在运行”是两件事。下面以已安装的 cron.service 为命令示例,操作其他程序时替换成实际服务单元,不要把看到的示例名称直接用于数据库或SSH等关键服务。先确认影响,再在维护窗口执行会改变状态的命令。
找准服务单元与原始状态
systemctl list-unit-files --type=service
service_unit=cron.service
systemctl status "$service_unit" --no-pager
systemctl is-active "$service_unit"
systemctl is-enabled "$service_unit"
loaded说明单元定义被加载,active说明单元处于活动状态,enabled说明存在开机拉起配置。一次性任务可能为active (exited),不能按守护进程running标准判断。not-found应先查包和真实单元名称;在没有systemd的容器里报“not booted with systemd”时,应改用容器或既有进程管理方式。
根据目标选择一个操作
| 目标 | 操作 | 注意 |
|---|---|---|
| 现在启动 | sudo systemctl start "$service_unit" | 不自动保证下次开机仍启动 |
| 设置开机启动 | sudo systemctl enable "$service_unit" | 通常不会立刻启动当前服务 |
| 同时自启并立即启动 | sudo systemctl enable --now "$service_unit" | 执行前确认该服务应当现在运行 |
| 停止当前服务 | sudo systemctl stop "$service_unit" | 可能中断业务;不自动取消开机启动 |
| 取消自启 | sudo systemctl disable "$service_unit" | 不等于停止当前进程 |
分清三种“重新加载”
reload请求服务按其支持方式重新读取配置,不是每个服务都支持。restart通常会停止再启动,可能断开连接。daemon-reload让systemd重新读取单元定义,不会代替程序读取自己的业务配置。不要为一个普通配置修改同时执行三种命令。
systemctl show "$service_unit" -p CanReload
sudo systemctl reload "$service_unit"
上面reload只在确认该服务支持重载、且对应配置已通过软件自身语法检查时执行。不支持reload就按软件文档安排重启,不能把报错吞掉后假定变更生效。修改了.service文件或drop-in时,先按相应单元检查方法验证,再使用daemon-reload,最后按变更要求处理服务。
验证运行状态与真实业务
systemctl status "$service_unit" --no-pager
sudo journalctl -u "$service_unit" --since "10 minutes ago" --no-pager
状态正常之后仍需做一项实际验证:定时任务看新输出,Web服务看实际请求,数据库看受控连接。failed时保存退出码和本次日志,修正原因后再启动;反复restart会覆盖故障时间线,也可能触发启动频率限制。SSH是唯一入口时尤其不能贸然停止它,应保留会话与恢复入口。