首页/系统/Linux 运维命令速查/systemctl 服务管理总入口
systemd 与服务42 条

systemctl 服务管理总入口

systemctl 管理 systemd 单元:start/stop/restart/reload 控制运行态,enable/disable 控制开机自启,status 看现状;Linux 服务管理的事实标准。

Linux 运维命令速查系统更新于 2026-10-13

systemctl 与服务两态

systemctl 是 systemd 的控制入口,管理 unit 这一层抽象:service(服务)、socket(套接字激活)、timer(定时任务)、target(启动目标)、mount(挂载点)等。日常使用最需要分清两套状态:运行态由 start/stop/restart/reload 控制,决定此刻有没有在跑;开机态由 enable/disable 控制,决定开机时是否被拉起。两者互相独立——enable 过的服务此刻可能没启动,正在跑的服务也可能没设自启。

基本信息

适用平台Linux(systemd 发行版);服务管理的事实标准,替代 service、chkconfig
命令语法systemctl [操作] [单元名];单元名可省略 .service 后缀
运行态操作start / stop / restart / reload / status / is-active
开机态操作enable / disable / is-enabled / mask / unmask
单元文件位置优先 /etc/systemd/system/(自定义),发行版自带在 /usr/lib/systemd/system/;同名时前者优先
权限要求启停与改自启需要 root 或加 sudo;查看单元的只读查询一般普通用户可执行

典型使用场景

  • 部署新服务:写单元文件后 daemon-reload,再 enable --now 一步完成设自启与启动
  • 改配置后生效:支持平滑的用 reload,不支持或改了启动参数的用 restart
  • 故障确认:status 看进程状态与最近日志尾部,再决定往 systemd 层还是应用层查
  • 批量巡检:systemctl --failed 列出所有失败单元,是排查机器异常的第一条命令
  • 查看依赖:list-dependencies 确认某个 target 下会拉起哪些服务
  • 禁止被依赖拉起:用 mask 彻底屏蔽,而不是只 disable

常用示例

常用示例
systemctl status myapp --no-pager -l   # 状态 + 最近日志
systemctl start myapp
systemctl restart myapp                # 先停后起,会中断连接
systemctl reload nginx                 # 平滑重载配置(需要应用支持)
systemctl enable --now myapp           # 设开机自启并立即启动
systemctl disable myapp
systemctl is-active --quiet myapp && echo running   # 脚本判断
systemctl --failed                     # 列出所有失败单元
systemctl daemon-reload                # 单元文件改动后必须执行
systemctl cat myapp                    # 打印最终生效的单元定义

操作对照

操作作用注意
start / stop改变当前运行状态不影响开机自启设置
restart停止后再启动有中断;数据库类服务可能丢未提交事务
reload重读配置,进程不重启依赖应用实现 ExecReload;单元没定义该字段就会失败
enable / disable建立或删除开机自启的软链接不改变当前运行状态
mask / unmask屏蔽到 /dev/null,依赖也无法拉起比 disable 更强,适合彻底禁用
daemon-reload让 systemd 重新读取单元文件只重读定义,不重启服务
reload 与 restart 的区别在中断成本:reload 通过 ExecReload(常见实现是给主进程发 SIGHUP)让应用重读配置,已有连接通常保留;restart 是先停止再启动,连接断开、内存态丢失。nginx、sshd 这类支持平滑重载的服务优先 reload。
脚本里判断服务是否在跑用 systemctl is-active --quiet 单元名,退出码为 0 表示运行中,非 0(未运行时通常为 3)表示未运行或失败,比解析 status 的文本输出稳定得多。
生产环境对数据库、消息队列这类有状态服务慎用 restart:会硬中断连接,触发主从切换或恢复流程。优先走应用提供的平滑重载、主备切换或分批重启方案,并避开业务高峰。
单元文件里几个字段决定行为:ExecStart 是启动命令,ExecReload 决定 reload 是否可用(没有这个字段时 reload 会直接失败),Restart=on-failure 表示异常退出后自动重启(配合 RestartSec 控制间隔),After 与 Wants 控制启动顺序和依赖关系,Requires 是强依赖(被依赖单元停止时本单元也停止)。systemctl cat 单元名 能看到最终生效的完整定义,包含所有 drop-in 片段。
用户级与模板:systemctl --user 管理当前登录用户的单元,不需要 root,常配合 loginctl enable-linger 让服务在退出登录后继续运行;模板单元以 @ 实例化,myapp@8001.service 里的 %i 会被替换为 8001,一台机器跑多实例时用它避免复制多份单元文件。

易错点

  • enable 只建开机自启软链接,不代表服务现在在跑;新装服务常出现「设了自启但没启动」
  • daemon-reload 不等于重启服务:改了单元里的 ExecStart 或环境变量,还要 systemctl restart 才生效
  • restart 对数据库类是硬中断,无脑执行可能丢事务或触发长时间恢复
  • 只做 disable 时服务仍可能被其他单元依赖拉起;要彻底禁用改用 mask
  • 改单元文件后不执行 daemon-reload,systemd 用的还是旧定义,表现为「改了没反应」

数据来源与参考

  • man 1 systemctl(systemd)
  • systemd 官方文档:systemctl

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌