直接用 systemctl start/stop 即可,但需 sudo 权限且服务名准确(如 ubuntu 用 apache2、centos 用 httpd);reload 不重启进程仅重载配置,restart 必然中断;启动后即死多因 execstart 错误或权限问题;enable 不启动服务,需 --now 才生效;改 unit 文件后必须 daemon-reload。

服务启停命令怎么写才不报错
直接用 systemctl start 或 stop 就行,但必须注意权限和服务名是否准确——普通用户不加 sudo 会提示“Permission denied”;服务名写错(比如写成 nginxd 而不是 nginx)则报 “Unit not found”。
- 服务名一般不用写
.service后缀,systemctl start nginx和systemctl start nginx.service效果一样,tab 键能自动补全,建议先敲一半按 tab 确认 - 常见服务名不是总和包名一致:Ubuntu 上是
apache2,CentOS/RHEL 上是httpd;firewalld在多数发行版中就是firewalld,别写成firewall - 如果提示 “Failed to start unit: Unit is masked”,说明被
systemctl mask过了,得先unmask才能操作
start/stop/restart/reload 四个动作的区别在哪
它们不是同一种重启逻辑,选错会导致服务中断或配置不生效。
-
start:仅启动,不管之前状态;stop:仅终止进程,不删状态文件 -
restart:先stop再start,必然有短暂中断,适合配置改完又不确定 reload 是否支持时兜底使用 -
reload:只让服务重新读配置,不杀进程,Nginx、OpenSSH、systemd-resolved 都支持;但 Apache 默认不支持reload(需启用mod_systemd),强行执行会 fallback 成restart,日志里会写明
为什么 service 启动了但 status 显示 inactive (dead)
这不是命令没运行,而是服务启动后立刻退出了——本质是服务进程崩溃或配置错误导致 systemd 认定它“失败”。
- 最常见原因是 ExecStart 指向的二进制不存在、路径写错,或工作目录(
WorkingDirectory)权限不足 - 用
systemctl show 服务名查看ExecStart=和WorkingDirectory=实际值,再手动执行那条命令试试 - 查日志比猜更准:
journalctl -u 服务名 --since "1 minute ago" -n 30看刚发生的错误输出,比如 “failed to bind port 80” 或 “cannot read config file”
开机自启 enable 和实际启动是两回事
enable 只建软链接,不启动服务;disable 也不停止正在运行的服务——这是很多人误以为“关了防火墙却还生效”的根源。
- 想一步到位:用
systemctl enable --now 服务名(启用 + 立即启动),或systemctl disable --now 服务名(禁用 + 立即停止) - 验证是否真生效:
systemctl is-enabled 服务名返回enabled才算设对;systemctl is-active 服务名返回active才算在跑 - 修改过
/etc/systemd/system/xxx.service文件后,必须执行systemctl daemon-reload,否则enable或start都读不到新内容
真正容易被忽略的,是 reload 的兼容性边界和 daemon-reload 的强制必要性——哪怕只是改了一个空格,不 reload,systemd 就当没改。










