当前位置: 首页 > news >正文

Linux - 系统服务管理(Systemd)

    Systemd 是 Linux 系统里用来**启动和管理服务(daemon)**的工具,是大多数现代 Linux 发行版(如 Ubuntu、CentOS、Debian、Fedora)默认的初始化系统。

           简单说,它就是你系统启动后,第一个跑起来的进程(PID 1),负责启动系统中其他的服务和进程,比如网络、SSH、数据库等等。

🌱 Systemd 的核心概念

概念

解释

Unit(单元)

Systemd 的核心对象,管理不同类型的系统资源。比如服务(.service)、挂载点(.mount)、定时任务(.timer)等。

Service

最常用的 unit 类型,用于定义和管理服务(后台运行的程序)。比如 nginx.service

Target

是一组 unit 的集合,比如 multi-user.target就是启动后正常工作的状态。


🛠 常用命令大全

以下命令都使用 systemctl 工具来操作:

▶️ 启动/停止服务

############################ nginx 案例 ##################################
# 启动服务
sudo systemctl start nginx

# 停止服务
sudo systemctl stop nginx

# 重启服务
sudo systemctl restart nginx

# 开启服务自启
sudo systemctl enable nginx

# 关闭服务自启
sudo systemctl disable nginx

# 查看服务
sudo systemctl status nginx

# 重新加载服务(配置变了用这个)
sudo systemctl reload nginx

############################ firewalld 案例 ##################################
# 启动服务
sudo systemctl start firewalld

# 停止服务
sudo systemctl stop firewalld

# 重启服务
sudo systemctl restart firewalld

# 开启服务自启
sudo systemctl enable firewalld

# 关闭服务自启
sudo systemctl disable firewalld

# 查看服务
sudo systemctl status firewalld

# 重新加载服务(配置变了用这个)
sudo systemctl reload firewalld

🔁 设置开机启动

# 设置服务开机自启
sudo systemctl enable nginx

# 取消开机启动
sudo systemctl disable nginx

📋 查看服务状态

# 查看服务当前状态
systemctl status nginx

# 查看所有服务
systemctl list-units --type=service

📄 查看服务日志(journal)

# 查看最近日志
journalctl -u nginx

# 实时查看日志(像 tail -f)
journalctl -f -u nginx

📦 Systemd 服务配置文件结构(*.service)

一个 .service 文件长这样:

[Unit]
Description=My Demo Service
After=network.target

[Service]
ExecStart=/usr/bin/my-demo-app
Restart=on-failure
User=demo

[Install]
WantedBy=multi-user.target

各段作用:

  • [Unit]:定义服务的描述、依赖
  • [Service]:定义具体怎么启动、怎么重启、用哪个用户等
  • [Install]:定义该服务在哪个 target 下启用(开机自动运行)

☕ 目标:让一个 Spring Boot(或任意)JAR 应用用 systemd 管理起来

比如你有一个 JAR 文件:

/opt/myapp/myapp.jar

        你希望开机自动启动它,随时 startstopstatusrestart 控制它,完美结合 Linux 的服务体系。


🧱 第一步:编写 .service 文件

创建一个服务配置文件,比如:

sudo touch /etc/systemd/system/myapp.service

内容如下(注意注释):

[Unit]
Description=My Java Application Service
After=network.target

[Service]
# 运行用户(建议不要用 root)
User=myuser
# 项目目录
WorkingDirectory=/opt/myapp
# 启动命令(注意 Java 路径和 JAR 路径)
ExecStart=/usr/bin/java -jar /opt/myapp/myapp.jar
# 可选:设置环境变量
Environment="JAVA_OPTS=-Xms256m -Xmx512m"
# 如果进程挂了自动重启
Restart=always
# 日志输出方式(journald)
StandardOutput=journal
StandardError=journal
# 可选:限制最大重启次数
RestartSec=10

[Install]
WantedBy=multi-user.target

⚠️ 小贴士:

  • User=myuser 这一行很重要,推荐创建一个单独的用户运行该服务,避免用 root。
  • /usr/bin/java 要确认你服务器上的 Java 路径,用 which java 可查。
  • Restart=always 会在服务异常终止时自动重启,非常实用。
  • 如果你希望将日志输出到某个文件,也可以用 StandardOutput=file:/var/log/myapp.log

🔁 第二步:启用并启动服务

# 重新加载 systemd 配置
sudo systemctl daemon-reload

# 设置开机自启
sudo systemctl enable myapp

# 启动服务
sudo systemctl start myapp

# 查看运行状态
systemctl status myapp

📜 第三步:查看日志

# 查看完整日志
journalctl -u myapp

# 实时查看(类似 tail -f)
journalctl -f -u myapp

🌟 一些实用命令小贴士

# 重新加载配置(改了 .service 文件后)
sudo systemctl daemon-reload

# 列出所有开机自启服务
systemctl list-unit-files | grep enabled

# 查看当前系统运行的 target
systemctl get-default

🧠 总结一句话

        Systemd 就像 Linux 的“调度总管”,负责把系统和服务安排得明明白白!

🌱系统服务管理(Systemd)从 一切内容都是文件 的角度怎么理解 ?

📁 一切皆文件的哲学

        在 Unix/Linux 世界,有一句经典语录:

Everything is a file:一切内容皆是文件

        就是说在 Linux 眼里,无论是硬件设备、进程、输入输出、配置,统统都表现为文件,你都可以 catlsreadwrite

         这不仅是技术设计,也是 Linux 极简优雅的哲学基础。

🔧 那 Systemd 怎么体现这个哲学?

        Systemd 是 Linux 的初始化系统和服务管理器,它完美延续了“一切皆文件”的思想。下面逐一来看:

1️⃣ 服务的配置是文件:.service

        Systemd 管理的每一个服务,都是通过一个 .service 文件定义的,比如:

/lib/systemd/system/nginx.service
/etc/systemd/system/myapp.service

        这些文件是纯文本文件,可以用任何编辑器打开修改,它描述了服务的行为,比如启动命令、依赖关系、用户权限等等。

你想定义个自己的服务?写个 .service 文件扔进 /etc/systemd/system/ 就行了,完美贴合“一切皆文件”的思路。


2️⃣ 服务的状态是文件(符号链接)

        启用服务本质是啥?其实就是创建符号链接:

/etc/systemd/system/multi-user.target.wants/nginx.service -> /lib/systemd/system/nginx.service

        这就意味着:Systemd 把是否启用某个服务通过“文件是否存在或链接”来判断

        所以 enable 就是“创建链接”,disable 就是“删除链接”。是否开机自启?看文件在不在。


3️⃣ 日志是文件(Journal)

        Systemd 使用自己的日志系统 journald,它记录服务日志的方式也接近“一切皆文件”。

        虽然日志不是传统意义上的文本文件,但它们存储在:

/var/log/journal/

        你用 journalctl 来访问它,其实就是去“读取一个文件结构的数据”。


4️⃣ Unit 是文件(不仅是 .service)

        Systemd 不止管理服务(.service),它还可以管理:

  • .socket:监听 socket 的单元
  • .timer:定时任务(替代 crontab)
  • .mount:挂载点
  • .path:路径监视

        这些全是文本文件定义的,存储在 /lib/systemd/system//etc/systemd/system/ 中,配置统一、逻辑清晰、符合“一切皆文件”。


5️⃣ Systemd 的状态接口也是“文件”(D-Bus + /proc

        虽然不是直接的文本文件,Systemd 通过 D-Bus 提供接口,也可以通过 /proc/sys/fs/cgroup/systemd/ 看到运行状态,进程的状态、资源限制等都能通过读文件接口获取


✅ 总结:Systemd 如何体现“一切皆文件”?

类型

表现形式

文件路径或操作

服务定义

.service文件

/etc/systemd/system//lib/systemd/system/

启动控制

符号链接

*.wants/ 目录下的链接

日志记录

二进制文件(journal)

/var/log/journal/

服务状态

文件系统接口

/proc//sys/fs/cgroup/

定时任务、socket

也是文件

.timer.socket

        Systemd 的设计延续了 Unix 的哲学,把系统的行为用“文件”来定义和管理,这一点让它既统一、可编程、又可读可控。

相关文章:

  • qt中的正则表达式
  • 【记录】Docker 镜像
  • Java-面向对象
  • ffprobe是如何处理命令行参数的.
  • BFD:网络链路检测与联动配置全攻略
  • 易境通WMS系统代理仓解决方案:让代理仓管理无后顾之忧!
  • 07软件测试需求分析案例-修改用户信息
  • 手机端可部署的开源大模型; 通义千问2.5训练和推理需要的内存和外存
  • 【DDR 内存学习专栏 1.4 -- DDR 的 Bank Group】
  • 机器学习:让数据开口说话的科技魔法
  • 网络基础和socket
  • 面试宝典(C++基础)-01
  • AlexNet神经网络详解及VGGNet模型和
  • 深度学习中的数学基础:从向量到概率的全面解析
  • 测试第三课-------自动化测试相关
  • 第十九讲 XGBoost 二分类模型案例(遥感数据识别玉米与小麦地块)
  • HTML:网页的骨架 — 入门详解教程
  • Python heapq模块
  • 【Pandas】pandas DataFrame items
  • AIGC工具平台-建筑平面图3D渲染
  • 王毅将出席中国一中亚外长第六次会晤、金砖国家外长会晤和第十五次金砖国家安全事务高级代表会议
  • 张广智当选陕西省慈善联合会会长
  • 全球最大车展在上海启幕,解放日报头版头条:“看懂上海车展,就能预判未来”
  • “沉默”的智驾:余承东不喊“遥遥领先”,何小鹏连夜改口 | 电厂
  • 外贸50城,谁在“扛大旗”?
  • 全国人大常委会启动工会法执法检查