Loading... ## 前言 在使用 Linux 服务器的过程中,我们经常会安装各种服务: * CloudDrive2 * OpenList * Nginx * Docker * frp * WebDAV * Jellyfin 刚开始接触 Linux 时,启动一个程序很简单: ```bash ./程序名 ``` 例如: ```bash ./clouddrive ``` 程序可以正常运行,看起来没有任何问题。 但是,当你真正把 Linux 当作服务器使用时,就会发现这种方式存在很多问题: * SSH 断开后程序是否还运行? * 服务器重启后程序怎么办? * 程序崩溃后谁负责重新启动? * 如何统一管理多个后台程序? 这时候就需要 Linux 中非常重要的一个组件: > **systemd** 本文将从最基础的程序启动开始,逐步理解 systemd 是什么,以及如何使用它管理自己的服务。 --- # 一、Linux 中运行一个程序到底发生了什么? 首先,我们执行: ```bash ./clouddrive ``` 实际上 Linux 做了一件事情: > 创建一个进程,并运行这个程序。 简单理解: ``` 终端 | | └── clouddrive进程 ``` 此时: * 当前终端负责启动它 * 当前用户拥有它 * 程序依赖当前环境 例如: ```bash root@ubuntu:/opt/clouddrive# ./clouddrive ``` 这个程序就是由当前 SSH 会话启动的。 --- # 二、直接运行程序有什么问题? ## 1. SSH 断开问题 很多人第一次搭建服务器都会遇到: 退出 SSH 后: ``` ssh连接关闭 ↓ 终端消失 ↓ 程序停止 ``` 虽然有时候 Linux 会保留进程,但这种方式并不可靠。 于是很多人使用: ```bash nohup ./clouddrive & ``` --- ## 三、nohup 是什么? `nohup` 的意思: > no hang up,不挂断。 例如: ```bash nohup ./clouddrive & ``` 表示: * 后台运行 * 忽略终端退出信号 结构变成: ``` Linux服务器 后台 | | └── clouddrive ``` 这样退出 SSH 后程序仍然运行。 --- 但是: `nohup` 依然不是一个完整的服务器方案。 因为它无法解决: ## 1. 开机自动启动 服务器重启: ``` 服务器重启 ↓ Ubuntu启动 ↓ 没有人执行 ./clouddrive ↓ 程序不存在 ``` --- ## 2. 自动恢复 如果: ``` clouddrive运行 ↓ 异常退出 ↓ 程序结束 ``` nohup 不会帮你重新启动。 --- 所以服务器需要一个更加专业的管理方式。 这就是: # systemd --- # 四、什么是 systemd? 简单来说: > systemd 是 Linux 系统中的服务管理器,负责管理后台程序的生命周期。 它类似 Windows 的: ``` Windows 服务管理 ``` 例如: Windows 中: ``` MySQL服务 Docker服务 Windows Update ``` Linux 中: ``` mysql.service docker.service nginx.service ``` --- systemd 可以帮助我们: ✅ 开机自动启动 ✅ 后台运行 ✅ 自动重启 ✅ 查看运行状态 ✅ 管理日志 --- # 五、systemd 的核心概念:service 文件 systemd 如何知道: * 程序在哪里? * 怎么启动? * 崩溃怎么办? 答案: > 通过 `.service` 文件。 例如: ``` /etc/systemd/system/clouddrive.service ``` 这个文件就是 CloudDrive2 的启动说明书。 --- # 六、创建第一个 systemd 服务 假设: 我的 CloudDrive2 位于: ``` /opt/clouddrive-2-linux-x86_64-1.0.11 ``` 启动文件: ``` clouddrive ``` 手动启动: ```bash cd /opt/clouddrive-2-linux-x86_64-1.0.11 ./clouddrive ``` 现在我们让 systemd 接管它。 --- 创建服务: ```bash nano /etc/systemd/system/clouddrive.service ``` 写入: ```ini [Unit] Description=CloudDrive2 After=network.target [Service] Type=simple WorkingDirectory=/opt/clouddrive-2-linux-x86_64-1.0.11 ExecStart=/opt/clouddrive-2-linux-x86_64-1.0.11/clouddrive Restart=always RestartSec=5 User=root [Install] WantedBy=multi-user.target ``` --- # 七、逐行理解 service 文件 ## 1. Unit 部分 ```ini [Unit] ``` 描述服务基本信息。 --- ### Description ```ini Description=CloudDrive2 ``` 服务名称。 查看状态时会显示: ``` CloudDrive2 ``` --- ### After ```ini After=network.target ``` 表示: 等待网络启动后再启动。 因为: CloudDrive2 需要访问: * 网盘 * 网络接口 所以必须先有网络。 --- # 2. Service 部分 这里是真正运行程序的地方。 --- ## WorkingDirectory ```ini WorkingDirectory=/opt/clouddrive-2-linux-x86_64-1.0.11 ``` 相当于: ```bash cd /opt/clouddrive-2-linux-x86_64-1.0.11 ``` --- ## ExecStart 最重要: ```ini ExecStart=/opt/clouddrive-2-linux-x86_64-1.0.11/clouddrive ``` 相当于: ```bash ./clouddrive ``` systemd 会执行这个命令启动程序。 --- ## Restart ```ini Restart=always ``` 表示: 程序退出后自动重新启动。 例如: ``` CloudDrive2异常退出 ↓ systemd检测 ↓ 重新启动CloudDrive2 ``` 这就是: ## 进程守护 --- ## RestartSec ```ini RestartSec=5 ``` 表示: 失败后等待5秒再启动。 避免: ``` 启动失败 ↓ 立即启动 ↓ 失败 ↓ 无限循环 ``` --- # 3. Install 部分 ```ini [Install] WantedBy=multi-user.target ``` 表示: 系统进入正常运行模式时加载该服务。 --- # 八、让 systemd 认识新的服务 创建 service 文件后: 执行: ```bash systemctl daemon-reload ``` 作用: 让 systemd 重新读取配置。 --- # 九、启动服务 启动: ```bash systemctl start clouddrive ``` 查看: ```bash systemctl status clouddrive ``` 如果正常: ``` Active: active (running) ``` 说明: CloudDrive2 正在运行。 --- # 十、设置开机启动 仅仅: ```bash systemctl start ``` 只是当前启动。 服务器重启后: 它不会自动启动。 所以需要: ```bash systemctl enable clouddrive ``` 执行后: ``` 服务器启动 ↓ systemd ↓ 自动启动CloudDrive2 ``` --- # 十一、常用 systemctl 命令 ## 启动 ```bash systemctl start clouddrive ``` --- ## 停止 ```bash systemctl stop clouddrive ``` --- ## 重启 ```bash systemctl restart clouddrive ``` --- ## 查看状态 ```bash systemctl status clouddrive ``` --- ## 开机启动 ```bash systemctl enable clouddrive ``` --- ## 取消开机启动 ```bash systemctl disable clouddrive ``` --- # 十二、systemd 和 nohup 的区别 | 功能 | nohup | systemd | | ----------------- | ------- | --------- | | 后台运行 | ✅ | ✅ | | 退出SSH保持运行 | ✅ | ✅ | | 开机自动启动 | ❌ | ✅ | | 自动恢复 | ❌ | ✅ | | 日志管理 | 一般 | ✅ | | 服务器管理 | 普通 | 专业 | 如果只是临时运行: ``` nohup ``` 即可。 如果是长期运行的服务器: ``` systemd ``` 才是正确方式。 --- # 十三、实际服务器中的应用 例如我的服务器: ``` 腾讯云 Ubuntu | | CloudDrive2 | OpenList | WebDAV | Infuse ``` 如果没有 systemd: 服务器重启: ``` CloudDrive停止 ↓ OpenList无法访问 ↓ Infuse无法播放 ``` 使用 systemd: ``` 服务器启动 ↓ systemd启动CloudDrive2 ↓ systemd启动OpenList ↓ 服务恢复 ``` --- # 十四、总结 从: ```bash ./clouddrive ``` 到: ```bash systemctl start clouddrive ``` 看似只是换了一种启动方式。 实际上代表 Linux 使用方式的改变: 以前: > 我手动运行一个程序。 现在: > 我让系统负责管理一个服务。 理解 systemd 后,你会发现 Linux 服务器中的很多软件: * Nginx * Docker * MySQL * OpenList * CloudDrive2 本质上都是: ``` 程序 ↓ service配置 ↓ systemd管理 ↓ 长期稳定运行 ``` 对于想搭建个人服务器、NAS、媒体库的人来说,systemd 是必须掌握的一项基础技能。 最后修改:2026 年 07 月 12 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 如果觉得我的文章对你有用,请随意赞赏
1 条评论
挺好