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,一台机器跑多实例时用它避免复制多份单元文件。