systemd服务全解析

Linux必学|systemd服务全解析,从入门到实操

作为Linux运维和开发者,你一定听过systemd这个词——它是Linux系统的大管家,掌控着系统启动、服务管理、日志监控等核心操作。

一、先搞懂:什么是systemd?

systemd 是 Linux 操作系统的系统和服务管理器,简单说,它是系统启动后第一个运行的进程,由内核直接启动,接管后续所有系统服务的启动、维护和停止,相当于Linux系统的总管家。

在systemd出现之前,Linux主要用 SysV init(简称sysv)管理服务,它通过串行执行脚本启动服务,效率低、依赖管理混乱,启动慢且容易出问题。

而systemd的诞生,就是为了解决这些痛点,它的核心优势的是:

  • 并行启动服务,大幅提升系统开机速度;
  • 精准管理服务依赖,避免“服务没启动就调用”的问题;
  • 统一日志管理,排查问题更高效;
  • 支持按需激活服务,节省系统资源;
  • 与传统sysv脚本向后兼容,降低学习成本。

如今,几乎所有主流Linux发行版都默认使用systemd。

二、核心概念:systemd的管理单元——Unit

在systemd的世界里,一切可管理的资源都叫单元(Unit),比如服务、定时任务、挂载点、网络套接字等,每种单元都有对应的配置文件,用于定义其运行规则。

2.1 最常用的5类Unit

不同类型的Unit,用后缀名区分,日常工作中接触最多的是这5种:

图片

2.2 Unit文件的存放位置

Unit文件主要存放在两个目录,优先级不同,记住这个规则能避免修改被覆盖:

/lib/systemd/system/:系统预装的Unit文件,不建议直接修改,软件更新会覆盖你的修改;

**/etc/systemd/system/**:管理员自定义的Unit文件,优先级更高,修改或新增服务时,优先在这里操作。

提示:如果需要修改系统预装的Unit文件,建议复制到/etc/systemd/system/目录后再修改,或用systemctl edit命令创建覆盖文件。

三、实操核心:systemctl命令

systemctl 是与systemd交互的核心命令,所有Unit的管理操作都通过它完成,以下是日常最常用的命令。

3.1 服务基础操作

以Nginx服务(nginx.service)为例:

1
2
3
4
5
6
7
8
# 启动服务
sudo systemctl start nginx
# 停止服务
sudo systemctl stop nginx
# 重启服务(服务异常时常用)
sudo systemctl restart nginx
# 重新加载配置(不中断服务,推荐用于配置修改后)
sudo systemctl reload nginx

注意:不是所有服务都支持reload,如果不确定,用restart替代即可。

3.2 开机自启配置

服务启动后,重启系统就失效了,原因是没设置开机自启。用这两个命令搞定:

1
2
3
4
5
6
# 设置开机自启
sudo systemctl enable nginx
# 取消开机自启
sudo systemctl disable nginx
# 查看是否已设置开机自启(返回enabled/disabled)
systemctl is-enabled nginx

3.3 服务状态查看

查看服务状态是排查故障的核心操作,能获取服务是否运行、PID、日志等关键信息:

1
2
3
4
5
6
7
8
# 查看单个服务详细状态(最常用)
systemctl status nginx
# 查看所有服务状态(输出较多,慎用)
systemctl list-units --type=service
# 只查看活跃的服务
systemctl list-units --type=service --state=active
# 查看所有启动失败的服务(快速定位故障)
systemctl --failed

状态输出:

  • Loaded:服务是否已加载,以及是否开机自启(enabled=开机自启,disabled=否);
  • Active:服务当前状态(running=运行中,exited=已退出,failed=启动失败);
  • Main PID:服务主进程ID,可用于杀死异常进程(kill PID)。

3.4 日志查看

systemd日志管理工具journalctl,能快速查看服务日志,定位启动失败原因:

1
2
3
4
5
6
7
8
# 查看指定服务的所有日志
journalctl -u nginx
# 查看指定服务的实时日志(类似tail -f)
journalctl -u nginx -f
# 查看最近10行日志(精简输出)
journalctl -u nginx -n 10
# 按时间筛选日志(例如:查看今天的日志)
journalctl -u nginx --since today

这里如果服务启动失败,直接用journalctl -u 服务名,通常能找到失败原因,比如配置文件错误、端口被占用。

3.5 系统运行级别切换

systemd用target替代了sysv的运行级别,常用的目标单元对应如下,可根据需求切换:

图片

切换命令示例(以切换到文本界面为例):

1
2
3
4
# 临时切换到文本界面(重启后失效)
sudo systemctl isolate multi-user.target
# 设置默认启动为文本界面(重启后生效)
sudo ln -sf /lib/systemd/system/multi-user.target /etc/systemd/system/default.target

四、进阶实战:自定义systemd服务

日常工作中,我们经常需要将自己写的脚本做成系统服务,实现后台运行、开机自启、故障自动重启,这就需要自定义.service文件。

下面以Python Web应用为例,一步步教你编写自定义服务。

4.1 自定义.service文件结构

一个完整的.service文件,包含3个核心区块,语法简单,按模板修改即可:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[Unit]
# 服务描述(必填,用于日志和命令显示)
Description=Python Web Application Service
# 服务依赖(可选,指定服务启动前需要启动的服务)
After=network.target # 网络启动后再启动本服务
# 弱依赖(可选,依赖服务失败不影响本服务)
Wants=network.target
[Service]
# 服务运行用户(建议用非root用户,提高安全性)
User=www
Group=www
# 服务启动类型(重点,默认simple)
Type=simple
# 启动命令(必填,写脚本/程序的绝对路径)
ExecStart=/usr/bin/python3 /opt/webapp/app.py
# 停止命令(可选,自定义停止逻辑)
ExecStop=/usr/bin/pkill -f app.py
# 重启策略(可选,服务失败时自动重启)
Restart=on-failure
# 重启间隔(可选,失败后等待3秒再重启)
RestartSec=3
[Install]
# 服务安装目标(必填,指定开机自启时关联的target)
WantedBy=multi-user.target

4.2 关键配置说明

Type(启动类型):默认simple,根据脚本类型选择:

  • simple:脚本直接前台运行;
  • forking:脚本以守护进程运行;
  • oneshot:一次性任务;
  • notify:脚本支持发送就绪信号。

Restart(重启策略):按需设置,推荐on-failure,避免服务意外挂掉。

User/Group:尽量不用root用户,创建专用用户运行服务,降低安全风险。

4.3 自定义服务部署步骤

1
2
3
4
5
6
7
8
9
10
# 1. 编写.service文件(文件名建议和服务名一致,如webapp.service)
sudo vim /etc/systemd/system/webapp.service
# 粘贴上面的模板,修改ExecStart、User等参数
# 2. 重载systemd配置(新增/修改服务后必须执行)
sudo systemctl daemon-reload
# 3. 启动服务并查看状态
sudo systemctl start webapp
systemctl status webapp
# 4. 设置开机自启
sudo systemctl enable webapp

如果启动失败,用journalctl -u webapp查看日志,排查ExecStart路径是否正确、用户权限是否足够等问题。

五、常见问题排查

  • 服务启动失败,提示“Loaded: error (Reason: No such file or directory)”?

检查.service文件路径是否正确,或文件名是否写错,确保在/etc/systemd/system/目录下。

  • 执行systemctl reload 提示“Job for xxx.service failed because the control process exited with error code”?

服务不支持reload,改用restart命令,或检查ExecReload配置是否正确。

  • 服务设置开机自启后,重启系统仍未启动?

检查[Install]区块的WantedBy是否正确,或执行systemctl is-enabled 服务名,确认是否为enabled状态。

  • 日志查看不到服务相关信息?

确保服务确实启动过,或添加–all参数(journalctl -u 服务名 –all),查看所有日志。

六、总结

systemd 作为现代Linux的核心服务管理器,看似复杂,实则掌握核心逻辑后非常简单:

核心是“Unit”,最常用的是.service(服务)和.target(目标);

操作靠“systemctl”,记住启动、停止、自启、日志4类核心命令;

自定义服务只需编写.service文件,按模板修改即可快速部署。

对于Linux运维和开发者来说,掌握systemd是必备技能——它能帮你高效管理服务、快速排查故障,让系统运行更稳定。