systemctl 管理服务的常用命令与易错点
发布时间:2025-11-07 21:23       
更新时间:2025-11-08 16:47
start 和 enable 的区别,是服务管理里最常被问的问题:start 是现在就跑,enable 是开机自启,两者互不包含。一个记忆方法:start 管"现在",enable 管"未来"。这条理清了,其余命令都好记。
日常四件套
systemctl start nginx,启动;stop nginx,停止;restart 会中断进程重跑,配置改错会导致起不来,慎用;reload 更温和,进程不中断,前提是服务支持;systemctl status nginx,看状态,输出自带最近几行日志,排障先看它。想一次看全开机自启名单,systemctl list-unit-files --state=enabled 一条命令列出来,排查开机变慢时先从这里翻。
enable 与 enable --now
systemctl enable nginx 只注册开机自启,当前并不启动。刚配置好的服务,常见组合 systemctl enable --now nginx,一步到位。反过来,disable 只取消自启,不停止正在跑的进程,想停还得补一个 stop。判断某个服务是否自启,systemctl is-enabled nginx 一条命令给答案,is-active 则看当前是否在跑。
daemon-reload 的时机
改了 unit 文件(比如 /etc/systemd/system/nginx.service)或者 systemctl edit 生成的覆盖配置后,必须 daemon-reload 一次,否则 systemd 用的还是内存里的旧定义。只改服务自身的业务配置(比如 nginx.conf)不需要它,reload nginx 就行。拿不准就先 reload 一次,代价可以忽略。改完再用 systemd-analyze verify 跑一遍语法检查,路径写错、字段拼错这类问题启动前就能暴露,省掉一轮无效重启。
用 drop-in 改服务行为
想让它失败后自动拉起,systemctl edit nginx 写入 [Service] 段的 Restart=on-failure 和 RestartSec=3,保存即生成 override.conf,比直接改原 unit 文件干净。看实际生效的定义用 systemctl cat nginx。自研程序也能托管进来:unit 里给 [Service] 段写 ExecStart=/opt/app/server,[Install] 段写 WantedBy=multi-user.target,存到 /etc/systemd/system/,daemon-reload 后照常 enable 与 start,崩溃自动拉起和开机自启一并解决。
服务起不来怎么办
systemctl status nginx -l 看完整状态,list-units --failed 列出失败的服务,再配合 journalctl -u nginx -n 50 翻日志。日志太多就加 -p err 只看错误级别,加 -b 只看本次开机以来的记录,两条过滤下来,有效信息一般不超过十几行。常见根因无非三类:配置语法错、端口被占用、目录权限不对,对照报错行逐一排除。一次型服务的 active (exited) 不是错误;反复失败留下的红色记录,reset-failed nginx 可以清掉。对自研服务,status 与 journalctl 的组合覆盖日常排障。
两个高频易错点收尾:一是 enable 之后以为服务已经在跑,结果访问 404;二是改了 unit 忘了 daemon-reload,怎么重启都不生效。把这两条记牢,一半的怪问题就消失了。