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 的哲学,把系统的行为用“文件”来定义和管理,这一点让它既统一、可编程、又可读可控。

Podman是一个轻量级的容器管理工具,它并不直接支持systemd服务管理,因为systemd主要是Linux发行版如Debian、Ubuntu等用于启动、管理和维护系统服务的标准工具。然而,你可以通过将 Podman 创建的Docker容器链接到systemd服务中来间接地实现类似的功能。 以下是基本步骤: 1. **创建Docker容器**: 使用Podman运行一个Docker容器,例如,一个Web服务器容器: ``` podman run -dit --name my-web-container nginx ``` 2. **设置环境变量或映射端口**: 如果需要让systemd访问容器内部的服务,可以暴露必要的端口或者设置环境变量,以便systemd能管理它们。 3. **编写systemd单元文件**: 编辑`/etc/systemd/system/my-web.service`(或者其他合适的路径),创建一个systemd服务描述文件。示例内容如下: ```ini [Unit] Description=My Web Application Container After=network.target [Service] ExecStart=/usr/local/bin/podman run --rm --link=my-web-container:webserver my-web-container Restart=always User=root [Install] WantedBy=multi-user.target ``` 这里假设`podman run`命令已经包含了启动容器所需的全部选项。 4. **启用并启动服务**: ```bash sudo systemctl enable my-web.service sudo systemctl start my-web.service ``` 5. **监控和管理**: 现在,你可以像管理普通systemd服务一样,使用`systemctl status`, `stop`, `restart`, 或 `status my-web.service`等命令。 请注意,这只是一个简化示例,实际部署时可能需要根据你的应用需求和环境调整配置。另外,如果你在非systemd环境中使用Podman,上述步骤可能不适用,这时你可能会选择其他方式来集成容器服务管理,比如supervisord或其他第三方工具。
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

烤代码的吐司君

你的支持是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值