Files
StudyDiary/02-学习笔记/在 __飞牛OS(或其他 Linux 系统)__ 中systemctl.md
T
2026-07-23 20:36:13 +08:00

198 lines
5.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
title: 在 __飞牛OS(或其他 Linux 系统)__ 中
created: 2026-07-02
source: Cherry Studio
tags:
---
**飞牛OS(或其他 Linux 系统)** 中,如果某个 **服务进程** 需要在启动时依赖其他前置服务(如数据库、网络等),可以通过以下方法找到并配置这些依赖关系:
---
## **1\. 查看现有服务的依赖(systemd 方式)**
飞牛OS 通常基于 `systemd` 管理服务,可以通过以下命令查看服务的依赖关系:
### **✅ 方法 1:使用** `systemctl list-dependencies`
```bash
# 查看某个服务的依赖树(例如 nginx)
systemctl list-dependencies nginx.service
```
**输出示例:**
```text
nginx.service
● ├─system.slice
● ├─basic.target
● │ ├─paths.target
● │ ├─sockets.target
● │ ├─sysinit.target
● │ └─timers.target
● └─network-online.target
```
- `network-online.target` 表示 `nginx` 依赖网络就绪后才启动。
---
### **✅ 方法 2:使用** `systemctl show`
```bash
# 查看服务的详细依赖信息(包括 Before/After/Wants/Requires
systemctl show nginx.service --property="Requires,Wants,After,Before"
```
**输出示例:**
```text
Requires=basic.target
Wants=network-online.target
After=network.target basic.target
Before=multi-user.target
```
- `Requires`:强依赖(如果该服务启动失败,当前服务也会失败)。
- `Wants`:弱依赖(即使依赖服务失败,当前服务仍会尝试启动)。
- `After`:确保该服务在 `network.target` 之后启动。
- `Before`:确保该服务在 `multi-user.target` 之前启动。
---
## **2\. 分析日志排查启动顺序**
如果服务启动异常(如依赖未满足),可以查看 `systemd` 日志:
```bash
# 查看所有服务的启动日志(按时间排序)
journalctl -b
# 仅查看某个服务的日志(如 mysql)
journalctl -u mysql.service -b
```
**示例问题:**
```text
nginx.service: Failed with result 'dependency'.
```
- 这表明 `nginx` 因依赖项未满足而启动失败。
---
## **3\. 手动设置服务依赖(修改** `.service` **文件)**
如果发现某个服务 **缺少依赖**(如 `app.service` 需要在 `mysql.service` 之后启动):
### **步骤 1:编辑服务文件**
```bash
sudo nano /etc/systemd/system/app.service
```
### **步骤 2:添加依赖关系**
`[Unit]` 部分修改或添加:
```ini
[Unit]
Description=My Application
Requires=mysql.service # 强依赖 MySQL
After=mysql.service # 确保 MySQL 启动后再启动本服务
```
### **步骤 3:重载配置并重启**
```bash
sudo systemctl daemon-reload
sudo systemctl restart app.service
sudo systemctl status app.service # 检查状态
```
---
## **4\. 特殊依赖管理(如** `network-online.target`****
某些服务需要 **网络完全就绪** 后才启动(否则可能因 DNS/路由未生效而失败):
```ini
[Unit]
Description=My Web Service
After=network-online.target # 确保网络完全可用(而不仅是 network.target
Wants=network-online.target # 弱依赖网络
Requires=mysql.service # 强依赖 MySQL
```
---
## **5\. 图形化管理(飞牛OS 可能适用)**
如果飞牛OS 提供 **任务计划或服务管理 GUI**,可以:
1. 进入 **控制面板 → 服务管理**(或类似路径)。
2. 查找目标服务(如 `Web Server`),检查其 **依赖项****启动顺序**
3. 手动调整启动优先级(类似 `systemd``Before/After`)。
---
## **6\. 案例:分析飞牛OS 内置服务**
#### **示例:飞牛NAS 的 Samba 服务依赖**
```bash
# 查看 Samba 的依赖项
systemctl show smbd.service --property="After,Requires"
```
**可能输出:**
```text
After=network.target nmbd.service
Requires=nmbd.service
```
- 说明 `smbd` 依赖 `nmbd`NetBIOS 服务)和网络(`network.target`)先启动。
#### **解决方案:**
如果想 **自定义前置任务**(如挂载存储后再启动 Samba):
```ini
[Unit]
Description=My Custom Samba Service
After=network.target storage-mount.service # 新增存储挂载依赖
Requires=nmbd.service storage-mount.service # 强依赖存储挂载
```
---
## **总结**
| **问题** | **排查方法** | **解决方案** |
| --- | --- | --- |
| 服务启动失败,提示依赖缺失 | `systemctl list-dependencies` | 修改 `.service` 文件的 `After/Requires` |
| 需要等待网络完全就绪 | `After=network-online.target` | 添加 `network-online.target` 依赖 |
| 服务启动顺序不符合预期 | `journalctl -b -u 服务名` | 调整 `Before/After` 顺序或依赖链 |
| 飞牛OS GUI 管理依赖 | 控制面板 → 任务计划 | 手动调整启动顺序或添加触发脚本 |
**关键命令备忘:**
```bash
systemctl list-dependencies <服务名> # 查看依赖树
systemctl show <服务名> --property=After # 查看 After 依赖
sudo systemctl edit <服务名> # 临时修改服务配置
journalctl -b -u <服务名> # 查看启动日志
```
这样就能精准定位并管理飞牛OS 中的 **服务依赖关系**,避免因启动顺序问题导致服务异常!