装完nginx/MySQL后,重启服务器服务就停了,不知道怎么设置开机自启?
服务启动失败,只提示“启动失败”,不知道去哪看报错、怎么排查?
网上教程一会用service命令,一会用systemctl,完全分不清该用哪个?
想自己写一个后台运行的脚本,却不知道怎么让它像系统服务一样被管理……???
这些问题的答案,都在今天的内容里。目前几乎所有主流Linux发行版(Ubuntu 18.04+、Debian 10+、CentOS 7+、Anolis OS 7+)都默认使用systemd作为系统与服务管理器,而systemctl就是操作systemd的核心命令。
本文从核心概念讲起,手把手带你吃透systemctl全量核心用法、服务配置文件编写、journalctl日志排查,搭配可直接复制的实操案例、实用技巧和避坑指南,新手跟着敲一遍就能完全掌握。
前置说明
- 本文实操完全适配 Ubuntu 18.04/20.04/22.04、Debian 10/11/12、CentOS 7/8、Anolis OS 7/8等所有使用systemd的主流Linux发行版;
- CentOS 6、Ubuntu 14.04等老旧系统使用SysVinit而非systemd,本文内容不适用;
- 大部分systemctl命令管理系统服务时,需要
sudo 提权,普通用户直接执行会提示权限不足; - 文中所有代码块均标注「可直接复制」,实操时注意替换占位符(如服务名),生产环境操作前请先在测试环境验证;
- 本文重点讲解服务管理核心用法,不会过度展开systemd的高级功能,避免新手信息过载。
一、先搞懂:systemd 核心概念
1. 什么是systemd?
systemd是Linux系统的系统与服务管理器,是系统开机后第一个启动的进程(PID=1),是所有用户进程和系统进程的父进程,相当于Linux系统的「大管家」。
它的核心作用包括:
- 管理系统启动流程,并行启动服务,大幅加快开机速度;
- 统一管理系统所有后台服务(守护进程),提供标准化的启动、停止、自启、状态查询能力;
- 统一管理系统日志、设备挂载、定时任务、网络等系统资源;
- 兼容传统的SysVinit服务脚本,向下兼容
service命令。
2. systemd 与 传统SysVinit 的核心区别
很多新手会看到网上的service命令,它是传统SysVinit的服务管理命令,和systemctl的核心区别用一张表就能讲清:
| | |
|---|
| | |
| 基于cgroups跟踪管理进程,能精准定位服务进程,不会出现进程脱离管理的问题 | 基于PID文件管理,容易出现孤儿进程、服务状态误判 |
| | |
| 标准化的enable/disable命令,配置统一 | |
| 配套journalctl统一管理所有服务和系统日志,可回溯、可过滤 | |
新手一句话总结:现在的主流系统都用systemd,优先用systemctl命令,service命令仅作为兼容保留,不用再花精力学习。
3. 核心术语:Unit(单元)
systemd把系统管理的所有资源都抽象为「Unit(单元)」,每个资源对应一个Unit配置文件,这是systemd的核心设计。
新手重点掌握最常用的6种Unit类型即可:
| | | |
|---|
| | 管理系统后台服务(守护进程),比如nginx.service、sshd.service | |
| | | |
| | | |
| | 用于对Unit进行分组,实现系统运行级别管理,比如multi-user.target | |
| | | |
| | | |
本文核心讲解.service服务单元的管理,这是新手日常使用频率最高的内容。
二、核心命令:systemctl 服务管理高频用法
systemctl是操作systemd的核心命令,我们按「日常使用频率」排序,分模块讲解,所有示例均以新手最熟悉的nginx、sshd服务为例,命令可直接复制执行。
2.1 服务状态查询(最常用,排查问题第一步)
核心命令:systemctl status
作用:查看服务的完整运行状态、启动信息、最近日志、PID、内存占用,是排查服务问题的第一步,必背。
# 语法:systemctl status 服务名.service# 1. 查看nginx服务的运行状态(.service后缀可省略,systemctl会自动补全)sudo systemctl status nginx# 等价于 sudo systemctl status nginx.service
输出示例与新手必懂字段解读
● nginx.service - The nginx HTTP and reverse proxy server Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; vendor preset: disabled) Active: active (running) since 三 2026-03-25 10:30:25 CST; 2h 15min ago Docs: man:nginx(8) Main PID: 1208 (nginx) Tasks: 2 (limit: 4096) Memory: 6.8M CPU: 205ms CGroup: /system.slice/nginx.service ├─1208 nginx: master process /usr/sbin/nginx └─1209 nginx: worker process3月 25 10:30:25 server systemd[1]: Starting The nginx HTTP and reverse proxy server...3月 25 10:30:25 server nginx[1208]: nginx: configuration file /etc/nginx/nginx.conf test is successful3月 25 10:30:25 server systemd[1]: Started The nginx HTTP and reverse proxy server.
| | |
|---|
| | ✅enabled=开启开机自启,disabled=关闭开机自启 |
| | ✅active (running)=正常运行,inactive (dead)=已停止,failed=启动失败 |
| | |
| | |
补充常用状态查询命令
# 1. 查看服务是否正在运行(输出active/inactive,适合脚本判断)systemctl is-active nginx# 2. 查看服务是否开启了开机自启(输出enabled/disabled)systemctl is-enabled nginx# 3. 查看系统中所有启动失败的服务(排查问题神器)systemctl --failed# 4. 查看所有已加载的服务单元列表systemctl list-units --type=service# 5. 查看系统所有服务的开机自启状态(包括未加载的)systemctl list-unit-files --type=service
2.2 服务的启动、停止、重启、重载
这是日常管理服务最核心的操作,所有命令都需要sudo提权。
# 1. 启动服务sudo systemctl start nginx# 2. 停止服务sudo systemctl stop nginx# 3. 重启服务(先停止再启动,服务会短暂中断)sudo systemctl restart nginx# 4. 重载服务配置(不中断服务,平滑重载配置,仅支持支持重载的服务)sudo systemctl reload nginx# 5. 条件重启:只有服务正在运行时才重启,没运行则不操作sudo systemctl try-restart nginx
新手关键区分:
restartreload:不中断服务,平滑重新加载配置文件,仅部分服务支持(如nginx、mysql、sshd),优先用reload,避免业务中断。
2.3 开机自启管理(新手最高频需求)
新手最常见的需求:装完软件后,设置重启服务器后服务自动启动,核心命令就是enable和disable。
# 1. 开启服务开机自启sudo systemctl enable nginx# 输出:Created symlink /etc/systemd/system/multi-user.target.wants/nginx.service → /usr/lib/systemd/system/nginx.service.# 解读:systemctl会自动创建开机自启的软链接,无需手动操作
# 2. 开启开机自启 + 立即启动服务(一步到位,新手推荐)sudo systemctl enable --now nginx# 等价于先执行enable,再执行start
# 3. 关闭服务开机自启sudo systemctl disable nginx
# 4. 重新开启开机自启(刷新自启配置)sudo systemctl reenable nginx
新手高频误区澄清:
❌ 错误认知:enable是启动服务,disable是停止服务;
✅ 正确解释:
enable/disable:控制的是服务开机是否自动启动,不影响服务当前的运行状态;start/stop- 想让服务现在启动,且开机也自动启动,必须同时执行
enable和start,或者用enable --now一步到位。
2.4 服务配置重载与屏蔽
1. daemon-reload:重载systemd配置文件
这是新手最容易忘的命令,只要修改了任何.service服务配置文件,必须执行这个命令,否则修改不会生效。
# 重载所有修改过的systemd单元配置文件sudo systemctl daemon-reload
核心说明:systemd会在系统启动时加载所有单元配置文件到内存,修改配置文件后,必须执行daemon-reload让systemd重新读取配置,否则修改不会生效,还会提示警告。
2. mask/unmask:屏蔽/取消屏蔽服务
有些服务可能会被其他程序或依赖自动启动,如果你想彻底禁止这个服务启动(包括手动启动和自动启动),就需要用mask命令,比disable更彻底。
# 1. 屏蔽服务,彻底禁止启动(手动/自动都无法启动)sudo systemctl mask nginx# 解读:systemctl会创建一个指向/dev/null的软链接,彻底屏蔽服务# 2. 取消屏蔽服务sudo systemctl unmask nginx
2.5 系统级操作(常用)
systemctl也可以直接管理系统的关机、重启、休眠等操作,比传统的shutdown命令更直观。
# 1. 重启系统sudo systemctl reboot# 2. 关机sudo systemctl poweroff# 3. 系统挂起(休眠到内存)sudo systemctl suspend# 4. 查看系统启动模式# 多用户命令行模式:multi-user.target# 图形界面模式:graphical.targetsystemctl get-default# 5. 设置系统默认启动为命令行模式(服务器推荐,节省资源)sudo systemctl set-default multi-user.target# 6. 设置系统默认启动为图形界面模式sudo systemctl set-default graphical.target
三、进阶实操:自定义.service服务单元文件
学会了管理系统自带的服务,很多新手会有需求:我自己写了一个脚本/程序,怎么让它像系统服务一样,被systemctl管理、设置开机自启、后台运行?
答案就是:编写一个自定义的.service单元配置文件,下面手把手带你完成一个完整的实操案例,新手跟着做一遍就会。
3.1 服务配置文件存放路径与优先级
首先要搞清楚配置文件放哪里,这是新手避坑的重点:
| | | |
|---|
| | | 存放我们自己编写的自定义服务配置,修改不会被系统更新覆盖 |
| | | 系统或通过yum/apt安装的软件,会自动把服务配置放在这里,不要手动修改这里的文件,系统更新会覆盖 |
| /usr/local/lib/systemd/system/ | | | |
新手必记:自己编写的自定义服务配置,必须放在 /etc/systemd/system/目录下,优先级最高,且不会被系统更新覆盖。
3.2 服务配置文件核心结构与字段
一个标准的.service文件分为三个核心区块,新手掌握这三个区块的常用字段即可:
| |
|---|
| |
| 定义服务的启动、停止、重载命令,运行用户、权限、重启策略等核心执行参数 |
| |
3.3 完整实操案例:编写一个自定义服务
我们以一个简单的后台脚本为例,编写一个自定义服务,实现:开机自动启动、后台运行、崩溃自动重启、被systemctl管理。
步骤1:准备一个测试脚本
先创建一个简单的shell脚本,模拟后台运行的程序:
# 1. 创建脚本文件sudo vim /usr/local/bin/test_service.sh
写入以下内容:
#!/bin/bash# 测试服务脚本:每秒输出一次当前时间到日志文件whiletruedoecho"$(date +'%Y-%m-%d %H:%M:%S') 服务正在运行" >> /var/log/test_service.log sleep 1done
给脚本添加执行权限:
sudo chmod +x /usr/local/bin/test_service.sh
步骤2:编写.service服务配置文件
# 创建服务配置文件,必须放在/etc/systemd/system/目录下sudo vim /etc/systemd/system/test_service.service
写入以下标准配置,注释里有每个字段的详细解释:
[Unit]# 服务的描述信息,status命令会显示Description=Test Custom Service - 自定义测试服务# 文档地址,可选Documentation=man:test_service(1)# 启动顺序:必须在网络.target启动完成后,再启动本服务After=network.target# 依赖关系:必须依赖的服务,依赖的服务启动失败,本服务也不会启动# Requires=mysql.service[Service]# 服务运行类型:simple=前台运行(默认),forking=后台fork子进程运行Type=simple# 服务启动的核心命令,必须写绝对路径!ExecStart=/usr/local/bin/test_service.sh# 服务停止命令,可选,不写默认会杀进程# ExecStop=/bin/kill -15 $MAINPID# 服务重载命令,可选# ExecReload=/bin/kill -HUP $MAINPID# 运行服务的用户和用户组,推荐用普通用户,不要用root,除非必须User=rootGroup=root# 重启策略:always=只要服务退出就自动重启,适合守护进程# 可选值:no(不重启)、on-failure(异常退出才重启)、always(总是重启)Restart=always# 重启间隔:服务退出后,等待5秒再重启RestartSec=5# 服务的工作目录WorkingDirectory=/usr/local/bin/# 标准输出和错误输出的日志路径,也可以用journalctl查看StandardOutput=append:/var/log/test_service.logStandardError=append:/var/log/test_service.log[Install]# 开机自启时,安装到multi-user.target(多用户模式)下,固定写法WantedBy=multi-user.target
步骤3:重载配置并启动服务
# 1. 重载systemd配置,让系统识别我们的新服务sudo systemctl daemon-reload# 2. 启动服务sudo systemctl start test_service# 3. 查看服务运行状态sudo systemctl status test_service
步骤4:设置开机自启
# 开启开机自启sudo systemctl enable --now test_service# 验证开机自启是否开启systemctl is-enabled test_service
步骤5:验证效果
# 查看脚本输出的日志tail -f /var/log/test_service.log# 测试自动重启:杀掉服务进程,看是否会自动重启sudo kill 进程PID# 等待5秒,再次查看状态,服务会自动重启sudo systemctl status test_service
3.4 新手编写服务文件的避坑指南
- 必须用绝对路径:ExecStart、ExecStop等所有命令里的路径,必须写绝对路径,不能用相对路径,否则服务会启动失败;
- 修改配置后必须重载:只要修改了.service文件,必须执行
sudo systemctl daemon-reload,否则修改不生效; - Type类型要选对:如果你的程序是前台运行的脚本/程序,Type选simple;如果是会自动fork到后台的程序(如nginx),Type选forking;
- 不要滥用root用户:如果服务不需要root权限,尽量用普通用户运行,提升安全性;
- Restart策略按需选择:测试环境可以用always,生产环境建议用on-failure,只在异常退出时重启。
四、配套日志排查:journalctl 命令详解
systemd统一管理了系统和所有服务的日志,journalctl是查看systemd日志的核心工具,是排查服务启动失败、运行异常的必备神器,新手必须掌握。
4.1 核心高频用法
# 1. 查看指定服务的日志(最常用,排查服务问题必用)journalctl -u nginx.service# 等价于 journalctl -u nginx# 2. 实时滚动刷新服务日志(类似tail -f)journalctl -u nginx -f# 3. 查看服务今天的日志journalctl -u nginx --since today# 4. 查看指定时间段的日志journalctl -u nginx --since "2026-03-24 10:00:00" --until "2026-03-25 12:00:00"# 5. 查看服务最近50行日志journalctl -u nginx -n 50# 6. 只看报错级别的日志(排查错误神器)journalctl -u nginx -p err# 日志级别:emerg、alert、crit、err、warning、notice、info、debug
4.2 进阶实用用法
# 1. 查看系统启动日志,排查开机启动失败的服务journalctl -b# 2. 查看上一次系统启动的日志(需开启日志持久化)journalctl -b -1# 3. 查看内核日志(等价于dmesg)journalctl -k# 4. 按用户过滤日志journalctl _UID=1000# 5. 清理日志(释放磁盘空间)# 清理日志,只保留最近7天的sudo journalctl --vacuum-time=7d# 清理日志,只保留1G大小sudo journalctl --vacuum-size=1G
4.3 新手必看:开启日志持久化
默认情况下,journalctl的日志存在内存中,系统重启后日志就会丢失,想要永久保存日志,需要修改配置开启持久化。
# 编辑journald配置文件sudo vim /etc/systemd/journald.conf
修改以下配置:
# 开启日志持久化,存储到/var/log/journal/目录Storage=persistent# 日志最大占用磁盘空间SystemMaxUse=5G# 日志最大保留时间MaxRetentionSec=30day
保存退出后,重启journald服务生效:
sudo systemctl restart systemd-journald
五、常见问题与避坑指南(重中之重)
1. 修改了服务配置文件,执行systemctl status提示警告,修改不生效
- 原因:修改了.service文件后,没有执行
daemon-reload重载配置,systemd还是用内存里的旧配置; - 解决方法:修改配置后,必须执行
sudo systemctl daemon-reload,再重启服务。
2. 服务设置了enable开机自启,但重启服务器后服务没有启动
- 原因1:服务的[Install]区块没有配置
WantedBy=multi-user.target,自启配置无效; - 原因2:服务启动依赖的其他服务没有启动,比如配置了
After=mysql.service,但mysql没有开机自启; - 原因3:服务启动失败,用
systemctl status 服务名和journalctl -u 服务名查看报错日志,排查启动失败原因; - 解决方法:先检查服务配置,再查看日志定位具体报错。
3. 执行systemctl start服务,提示“Unit xxx.service is masked.”
- 解决方法:先执行
sudo systemctl unmask 服务名取消屏蔽,再启动服务。
4. 自定义服务启动失败,提示“Permission denied”
- 原因1:ExecStart的脚本/程序没有执行权限,需要用
chmod +x添加执行权限; - 原因2:脚本/程序的路径不是绝对路径,systemd找不到;
- 原因3:运行服务的User用户,没有脚本/程序的访问权限;
5. 用service命令和systemctl命令查看到的服务状态不一致
- 原因:混用了传统service命令和systemctl命令,部分老脚本没有适配systemd;
- 解决方法:在使用systemd的系统中,全程用systemctl命令管理服务,不要混用service命令。
六、常用命令速查表(建议收藏,日常直接查)
# ===================== 服务状态查询 =====================sudo systemctl status 服务名 # 查看服务完整运行状态systemctl is-active 服务名 # 查看服务是否正在运行systemctl is-enabled 服务名 # 查看服务是否开启开机自启systemctl --failed # 查看所有启动失败的服务systemctl list-units --type=service # 查看所有已加载的服务# ===================== 服务启停与重载 =====================sudo systemctl start 服务名 # 启动服务sudo systemctl stop 服务名 # 停止服务sudo systemctl restart 服务名 # 重启服务sudo systemctl reload 服务名 # 平滑重载服务配置sudo systemctl try-restart 服务名 # 条件重启(运行中才重启)# ===================== 开机自启管理 =====================sudo systemctl enable 服务名 # 开启服务开机自启sudo systemctl enable --now 服务名 # 开启开机自启并立即启动sudo systemctl disable 服务名 # 关闭服务开机自启sudo systemctl reenable 服务名 # 重新刷新开机自启配置# ===================== 服务配置与屏蔽 =====================sudo systemctl daemon-reload # 重载所有修改过的服务配置文件sudo systemctl mask 服务名 # 彻底屏蔽服务,禁止启动sudo systemctl unmask 服务名 # 取消服务屏蔽# ===================== 系统级操作 =====================sudo systemctl reboot # 重启系统sudo systemctl poweroff # 关机systemctl get-default # 查看系统默认启动模式sudo systemctl set-default multi-user.target # 设置默认启动为命令行模式# ===================== 日志排查 journalctl =====================journalctl -u 服务名 # 查看指定服务的日志journalctl -u 服务名 -f # 实时滚动查看服务日志journalctl -u 服务名 --since today # 查看服务今天的日志journalctl -u 服务名 -p err # 查看服务的报错日志journalctl --vacuum-time=7d # 清理7天前的日志
七、总结(建议重点理解)
1、 systemd是当前主流Linux系统的系统与服务管理器,PID=1,是系统的「大管家」,systemctl是管理systemd服务的核心命令;2、新手核心必背命令:status查状态、start/stop启停服务、restart/reload重启/重载、enable/disable管理开机自启,记住这几个就能应对80%的日常场景;3、 新手高频误区:enable控制开机自启,start控制当前启动,两者不能混淆;修改服务配置后,必须执行daemon-reload重载;4.、自定义服务配置文件必须放在/etc/systemd/system/目录下,核心分为[Unit]、[Service]、[Install]三个区块,启动命令必须用绝对路径;5、journalctl 是排查服务问题的核心工具,通过-u 服务名可以精准查看服务日志,快速定位启动失败、运行异常的原因; 6. 生产环境操作原则:优先用reload替代restart,避免业务中断;修改配置前先备份,测试环境验证后再到生产环境执行。
学会systemd和systemctl服务管理,你就能彻底掌控Linux系统的后台服务,不管是软件部署、服务器运维,还是故障排查,都能游刃有余。
如果你觉得本文对你有帮助,欢迎点赞、推荐、转发,关注我,后续会分享更多Linux入门干货!
文 / 零距技术仓记录每一次真实的折腾 (#^.^#)🚀 想看到更多实用折腾技巧?👉 先关注💬 评论区说说你的经历或想看的内容👍 点赞表示支持🔁 顺手分享给也在折腾的人,让大家都少踩坑 😎