当前位置:首页>Linux>Linux运维必学:systemctl命令实操,开机自启一步到位

Linux运维必学:systemctl命令实操,开机自启一步到位

  • 2026-09-29 17:29:54
Linux运维必学:systemctl命令实操,开机自启一步到位

装完nginx/MySQL后,重启服务器服务就停了,不知道怎么设置开机自启?

服务启动失败,只提示“启动失败”,不知道去哪看报错、怎么排查?

网上教程一会用service命令,一会用systemctl,完全分不清该用哪个?

想自己写一个后台运行的脚本,却不知道怎么让它像系统服务一样被管理……???

这些问题的答案,都在今天的内容里。目前几乎所有主流Linux发行版(Ubuntu 18.04+、Debian 10+、CentOS 7+、Anolis OS 7+)都默认使用systemd作为系统与服务管理器,而systemctl就是操作systemd的核心命令。

本文从核心概念讲起,手把手带你吃透systemctl全量核心用法、服务配置文件编写、journalctl日志排查,搭配可直接复制的实操案例、实用技巧和避坑指南,新手跟着敲一遍就能完全掌握。

前置说明

  1. 本文实操完全适配 Ubuntu 18.04/20.04/22.04、Debian 10/11/12、CentOS 7/8、Anolis OS 7/8等所有使用systemd的主流Linux发行版;
  2. CentOS 6、Ubuntu 14.04等老旧系统使用SysVinit而非systemd,本文内容不适用;
  3. 大部分systemctl命令管理系统服务时,需要 sudo 提权,普通用户直接执行会提示权限不足;
  4. 文中所有代码块均标注「可直接复制」,实操时注意替换占位符(如服务名),生产环境操作前请先在测试环境验证;
  5. 本文重点讲解服务管理核心用法,不会过度展开systemd的高级功能,避免新手信息过载。

一、先搞懂:systemd 核心概念

1. 什么是systemd?

systemd是Linux系统的系统与服务管理器,是系统开机后第一个启动的进程(PID=1),是所有用户进程和系统进程的父进程,相当于Linux系统的「大管家」。

它的核心作用包括:

  • 管理系统启动流程,并行启动服务,大幅加快开机速度;
  • 统一管理系统所有后台服务(守护进程),提供标准化的启动、停止、自启、状态查询能力;
  • 统一管理系统日志、设备挂载、定时任务、网络等系统资源;
  • 兼容传统的SysVinit服务脚本,向下兼容service命令。

2. systemd 与 传统SysVinit 的核心区别

很多新手会看到网上的service命令,它是传统SysVinit的服务管理命令,和systemctl的核心区别用一张表就能讲清:

特性
systemd(systemctl)
传统SysVinit(service)
启动方式
并行启动服务,开机速度快
串行启动服务,一个启动失败会阻塞后续流程
进程管理
基于cgroups跟踪管理进程,能精准定位服务进程,不会出现进程脱离管理的问题
基于PID文件管理,容易出现孤儿进程、服务状态误判
服务状态
能实时查询服务完整状态、启动日志、依赖关系
仅能查看简单的运行/停止状态
开机自启
标准化的enable/disable命令,配置统一
需手动创建/删除软链接,操作繁琐,容易出错
日志系统
配套journalctl统一管理所有服务和系统日志,可回溯、可过滤
日志分散在各个文件中,无统一管理能力

新手一句话总结:现在的主流系统都用systemd,优先用systemctl命令,service命令仅作为兼容保留,不用再花精力学习。

3. 核心术语:Unit(单元)

systemd把系统管理的所有资源都抽象为「Unit(单元)」,每个资源对应一个Unit配置文件,这是systemd的核心设计。

新手重点掌握最常用的6种Unit类型即可:

Unit类型
后缀
核心作用
新手关注优先级
服务单元
.service
管理系统后台服务(守护进程),比如nginx.service、sshd.service
⭐⭐⭐⭐⭐
挂载单元
.mount
管理文件系统挂载,替代传统的fstab部分功能
⭐⭐⭐
套接字单元
.socket
管理进程间通信的套接字,实现服务按需启动
⭐⭐
目标单元
.target
用于对Unit进行分组,实现系统运行级别管理,比如multi-user.target
⭐⭐⭐
定时器单元
.timer
管理定时任务,替代传统的crontab部分功能
⭐⭐
设备单元
.device
管理系统硬件设备
⭐

本文核心讲解.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.
字段
含义
新手重点关注
Loaded
服务是否加载、配置文件路径、是否开启开机自启
✅enabled=开启开机自启,disabled=关闭开机自启
Active
服务当前运行状态
✅active (running)=正常运行,inactive (dead)=已停止,failed=启动失败
Main PID
服务主进程的PID
✅ 可结合之前学的ps/top命令查看进程详情
底部日志
服务最近的启动日志、报错信息
✅ 服务启动失败时,这里直接看报错原因

补充常用状态查询命令

# 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

新手关键区分:

  • restart
    :会中断服务,先杀进程再启动,所有服务都支持;
  • reload
    :不中断服务,平滑重新加载配置文件,仅部分服务支持(如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
操作
效果
适用场景
disable
关闭开机自启,仍可手动启动服务
不需要开机自启,但偶尔需要手动启动
mask
彻底禁止服务启动,手动/自动都无法启动
彻底禁用不需要的服务,防止被意外启动

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 服务配置文件存放路径与优先级

首先要搞清楚配置文件放哪里,这是新手避坑的重点:

路径
类型
优先级
适用场景
/etc/systemd/system/
系统级、用户自定义配置
最高
存放我们自己编写的自定义服务配置,修改不会被系统更新覆盖
/usr/lib/systemd/system/
系统级、软件包自带配置
中
系统或通过yum/apt安装的软件,会自动把服务配置放在这里,不要手动修改这里的文件,系统更新会覆盖
/usr/local/lib/systemd/system/
系统级、本地软件配置
低
手动编译安装的软件存放配置的路径

新手必记:自己编写的自定义服务配置,必须放在 /etc/systemd/system/目录下,优先级最高,且不会被系统更新覆盖。

3.2 服务配置文件核心结构与字段

一个标准的.service文件分为三个核心区块,新手掌握这三个区块的常用字段即可:

区块
核心作用
[Unit]
定义服务的元信息、依赖关系、启动顺序
[Service]
定义服务的启动、停止、重载命令,运行用户、权限、重启策略等核心执行参数
[Install]
定义服务的开机自启配置,安装到哪个target组

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 新手编写服务文件的避坑指南

  1. 必须用绝对路径
    :ExecStart、ExecStop等所有命令里的路径,必须写绝对路径,不能用相对路径,否则服务会启动失败;
  2. 修改配置后必须重载
    :只要修改了.service文件,必须执行sudo systemctl daemon-reload,否则修改不生效;
  3. Type类型要选对
    :如果你的程序是前台运行的脚本/程序,Type选simple;如果是会自动fork到后台的程序(如nginx),Type选forking;
  4. 不要滥用root用户
    :如果服务不需要root权限,尽量用普通用户运行,提升安全性;
  5. 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.”

  • 原因:服务被mask屏蔽了,彻底禁止了启动;
  • 解决方法:先执行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入门干货!

文 / 零距技术仓记录每一次真实的折腾 (#^.^#)🚀 想看到更多实用折腾技巧?👉 先关注💬 评论区说说你的经历或想看的内容👍 点赞表示支持🔁 顺手分享给也在折腾的人,让大家都少踩坑 😎

最新文章

随机文章