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

如何把服务加到systemctl

-------------------------------------------------------------------------------

要将应用(程序 / 脚本)添加到 systemctl 管理,核心是创建一个符合规范的 .service 单元文件(放在 /etc/systemd/system/ 目录下),然后通过 systemctl 命令加载、启用即可。以下是 step-by-step 完整教程,适用于大多数 Linux 发行版(CentOS 7+/Ubuntu 16.04+/Debian 9+ 等)。

核心原理

systemdsystemctl 是其命令行工具)通过 “单元文件”(.service)管理服务,文件中定义了服务的启动命令、运行用户、依赖关系、重启策略等。只要按格式编写该文件,systemctl 就能识别并管理你的应用。

步骤 1:创建 .service 单元文件

1.1 确定文件路径

单元文件需放在 /etc/systemd/system/(系统级服务,所有用户可用)或 ~/.config/systemd/user/(用户级服务,仅当前用户可用)。推荐用系统级(需 sudo),以 myapp.service 为例(服务名可自定义,如 nginx.servicejava-app.service):
bash
 
运行
 
 
 
 
sudo vim /etc/systemd/system/myapp.service
 

1.2 编写单元文件(关键!)

根据应用类型(前台运行 / 后台运行、脚本 / 二进制程序),选择对应的模板,替换占位符即可。
模板 1:通用后台服务(最常用,如 Java 程序、Python 脚本、二进制程序)
适用于需要后台运行、意外退出后自动重启的应用:
ini
 
 
[Unit]
Description=My Custom Application  # 服务描述(自定义,如“我的Java应用”)
After=network.target  # 服务启动依赖:网络就绪后再启动(可选,如依赖数据库可加 mysql.service)[Service]
User=root  # 运行服务的用户(建议用普通用户,如 appuser,需提前创建)
Group=root  # 运行服务的组(与 User 对应)
WorkingDirectory=/opt/myapp  # 应用工作目录(程序/脚本所在目录)
ExecStart=/opt/myapp/start.sh  # 启动命令(绝对路径!如:/usr/bin/java -jar app.jar、/usr/bin/python3 script.py)
Restart=always  # 重启策略:always(总是重启)、on-failure(失败时重启)、never(不重启)
RestartSec=3  # 重启间隔(秒,如意外退出后3秒重启)
KillSignal=SIGINT  # 停止信号(默认即可,无需修改)[Install]
WantedBy=multi-user.target  # 服务安装目标:多用户模式下启动(默认,无需修改)
 
模板 2:前台运行的服务(如某些无后台模式的程序)
部分程序默认前台运行(不后台 daemonize),需用 Type=simple(默认)或 Type=exec,无需额外配置:
ini
 
 
[Unit]
Description=Foreground Application
After=network.target[Service]
User=appuser
WorkingDirectory=/home/appuser/myapp
ExecStart=/home/appuser/myapp/run.sh  # 程序前台运行命令
Restart=on-failure
StandardOutput=journal+console  # 输出到日志和控制台(可选)[Install]
WantedBy=multi-user.target
 
模板 3:带环境变量的服务(如需要自定义 PATH、配置文件路径)
ini
 
 
[Unit]
Description=App with Env Vars[Service]
User=appuser
WorkingDirectory=/opt/myapp
Environment="JAVA_HOME=/usr/lib/jvm/java-11-openjdk"  # 环境变量1
Environment="CONFIG_PATH=/opt/myapp/config.yml"  # 环境变量2
ExecStart=/usr/bin/java -jar app.jar --config $CONFIG_PATH
Restart=always[Install]
WantedBy=multi-user.target
 

关键参数说明(必看!)

参数作用
ExecStart 核心!启动服务的绝对路径命令(不能用相对路径,如 ./start.sh 需改为 /opt/myapp/start.sh
User/Group 指定运行服务的用户(避免用 root,需提前创建普通用户:sudo useradd -m appuser
Restart 重启策略:always(推荐,意外退出自动恢复)、on-failure(仅错误退出时重启)、never
WorkingDirectory 应用的工作目录(如程序需要读取当前目录下的配置文件,必须指定)
After 依赖服务(如依赖数据库,写 After=mysql.service mariadb.service

步骤 2:加载并验证服务

2.1 重新加载 systemd 配置

修改 / 创建 .service 文件后,需让 systemd 识别新服务:
bash
 
运行
 
 
 
 
sudo systemctl daemon-reload
 

2.2 验证服务文件是否有效

检查配置是否有语法错误(关键!避免启动失败):
bash
 
运行
 
 
 
 
sudo systemctl status myapp.service
 
  • 若输出 Loaded: loaded (/etc/systemd/system/myapp.service; disabled; vendor preset: disabled),说明文件无语法错误,已被识别;
  • 若报错 invalid unit file,需回头检查 .service 文件的格式(如括号匹配、参数拼写)。

步骤 3:管理服务(启动、开机自启等)

3.1 启动服务

bash
 
运行
 
 
 
 
sudo systemctl start myapp.service
 
(可简写为 sudo systemctl start myapp.service 后缀可省略)

3.2 查看服务状态(确认是否启动成功)

bash
 
运行
 
 
 
 
sudo systemctl status myapp
 
  • 若显示 active (running),说明启动成功;
  • 若显示 failed,查看日志排查错误:sudo journalctl -u myapp -f-f 实时滚动日志)。

3.3 设置开机自启

bash
 
运行
 
 
 
 
sudo systemctl enable myapp
 
  • 取消开机自启:sudo systemctl disable myapp

3.4 其他常用操作

bash
 
运行
 
 
 
 
sudo systemctl stop myapp        # 停止服务
sudo systemctl restart myapp     # 重启服务
sudo systemctl reload myapp      # 重载服务(若应用支持热重载,无需停止)
sudo journalctl -u myapp         # 查看服务日志(历史)
sudo journalctl -u myapp -f      # 实时查看服务日志
 

常见问题排查

1. 服务启动失败(status 显示 failed

  • 优先看日志:sudo journalctl -u myapp -f,日志会提示具体错误(如 “文件不存在”“权限不足”);
  • 检查 ExecStart 路径是否正确(用 which java/which python3 确认命令绝对路径);
  • 检查工作目录 WorkingDirectory 是否存在,运行用户是否有读写权限。

2. daemon-reload 后仍识别不到服务

  • 确认 .service 文件放在 /etc/systemd/system/(系统级)或 ~/.config/systemd/user/(用户级);
  • 文件名后缀必须是 .service(如 myapp.service,不能是 myapp)。

3. 服务启动后立即退出

  • 检查应用是否支持后台运行(若前台程序,需用模板 2,无需加 & 后台符号);
  • 调整 Restart=on-failure,并查看日志是否有程序崩溃信息。

示例:添加 Java 应用到 systemctl

假设 Java 程序路径为 /opt/myapp/app.jar,运行用户为 appuser,则 .service 文件如下:
ini
 
 
[Unit]
Description=Java Application Service
After=network.target[Service]
User=appuser
Group=appuser
WorkingDirectory=/opt/myapp
ExecStart=/usr/bin/java -jar app.jar
Restart=always
RestartSec=5[Install]
WantedBy=multi-user.target
 
按步骤执行:
bash
 
运行
 
 
 
 
sudo vim /etc/systemd/system/java-app.service  # 粘贴上面内容
sudo systemctl daemon-reload
sudo systemctl start java-app
sudo systemctl enable java-app
sudo systemctl status java-app  # 验证
 
只要按模板编写 .service 文件,几乎所有应用都能被 systemctl 管理。如果你的应用有特殊需求(如依赖其他服务、需要自定义停止命令),可以告诉我具体场景,我会调整配置~

-------------------------------------------------------------------------------

如何查看 systemctl 的哪些应用
要查看 systemctl 管理的所有应用(即系统服务,.service 单元),可以通过 systemctl 的内置查询命令实现,支持按 “所有服务”“运行中服务”“已启用服务” 等维度筛选。以下是最常用的方法:

核心命令:查看所有已安装的服务

bash
 
运行
 
 
 
 
systemctl list-unit-files --type=service
 

说明:

  • list-unit-files:列出系统中所有 “单元文件”(包括服务、定时器、挂载点等);
  • --type=service:仅筛选 服务类型(排除定时器、挂载点等其他单元);
  • 输出结果包含 3 列:
    1. UNIT:服务名称(如 nginx.servicesshd.service);
    2. STATE:服务的 “启用状态”(enabled 开机自启、disabled 开机不启、masked 禁用、static 无法手动启动);
    3. VENDOR PRESET:系统默认预设状态(通常与 STATE 一致)。

常用筛选:按 “运行状态” 查看

1. 查看当前正在运行的服务

bash
 
运行
 
 
 
 
systemctl list-units --type=service --state=running
 

说明:

  • list-units:列出当前 “活跃的单元”(仅显示正在运行 / 激活的服务,而非所有已安装服务);
  • --state=running:仅筛选 运行中 的服务;
  • 输出会显示服务的 PID、内存占用、启动时间等实时状态。

2. 查看所有 “活跃” 服务(包括运行中、已停止但已激活的)

bash
 
运行
 
 
 
 
systemctl list-units --type=service --state=active
 

3. 查看开机自启的服务

bash
 
运行
 
 
 
 
systemctl list-unit-files --type=service --state=enabled
 
  • 仅显示 STATE 为 enabled(开机自启)的服务,适合检查哪些应用会随系统启动。

4. 查看所有服务(包括活跃 / 非活跃,带详细状态)

bash
 
运行
 
 
 
 
systemctl list-units --type=service --all
 
  • --all:显示所有服务(包括未运行、已失效的服务);
  • 适合排查 “已安装但未运行” 的服务(如 STATE 为 inactive 的服务)。

5. 搜索特定服务(模糊匹配)

如果知道服务名称关键词(如 nginxmysql),用 grep 过滤:
bash
 
运行
 
 
 
 
# 搜索包含 nginx 的服务(所有已安装)
systemctl list-unit-files --type=service | grep nginx# 搜索正在运行的包含 ssh 的服务
systemctl list-units --type=service --state=running | grep ssh
 

6. 简洁查看:仅列出服务名称

如果只需快速获取服务名称(无需状态),可以简化输出:
bash
 
运行
 
 
 
 
# 所有已安装服务(仅名称)
systemctl list-unit-files --type=service --quiet# 正在运行的服务(仅名称)
systemctl list-units --type=service --state=running --quiet
 
  • --quiet:仅输出服务名称(如 nginx.service),不显示表头和状态列,适合脚本处理。

补充:查看服务详情

如果找到某个服务,想查看其详细信息(启动命令、依赖、日志路径等):
bash
 
运行
 
 
 
 
# 替换为具体服务名(如 nginx.service)
systemctl show --all nginx.service
 
或查看更易读的状态摘要:
bash
 
运行
 
 
 
 
systemctl status nginx.service
 

总结:常用命令速查表

需求命令 
所有已安装的服务(含启用状态) systemctl list-unit-files --type=service  
当前运行中的服务 systemctl list-units --type=service --state=running  
开机自启的服务 systemctl list-unit-files --type=service --state=enabled  
搜索特定服务(如 nginx) `systemctl list-unit-files --type=service grep nginx`
查看服务详细信息 systemctl status 服务名.service  
通过以上命令,就能全面掌握 systemctl 管理的所有应用(服务)啦!如果需要进一步操作某个服务(启动、停止、设置开机自启),也可以告诉我~

-------------------------------------------------------------------------------

你执行的这条 tcpdump 命令用于抓取指定端口(80、9301、9302)或指定目标主机(11.*.8*)的所有网络流量,并保存到 http_https.pcap 文件中。以下是详细解析和使用说明:

命令各部分含义

参数 / 选项作用
sudo 以 root 权限执行(抓包需要底层网络权限,普通用户可能失败)
tcpdump 核心抓包工具(Linux/macOS 内置,Windows 需用 Wireshark 替代)
-i any 监听所有网络接口(any 表示所有网卡,也可指定具体网卡如 eth0en0
"port 9301 or port 9302 or port 80 or host 11.*.8*" 抓包过滤规则:
 
- 匹配 端口 80(HTTP 协议默认端口)
 
- 匹配 端口 9301/9302(自定义服务端口)
 
- 匹配 目标 / 源主机为 11.*.8* 的所有流量
 
or 表示 “或”,满足任一条件即抓取)
-w http_https.pcap 将抓包数据保存到文件(-w 表示写文件,pcap 是标准抓包格式,可用于 Wireshark 分析)

关键注意事项

  1. 权限要求:必须用 sudo 执行,否则会报错 tcpdump: permission denied(普通用户无网络抓包权限)。
  2. 过滤规则说明:你的规则会抓取以下所有流量:
    • 所有 80 端口的 HTTP 流量(无论源 / 目标);
    • 所有 9301/9302 端口的流量(可能是自定义服务,如 Elasticsearch 集群通信等);
    • 所有与 11.*.8* 主机通信的流量(无论端口,包括 TCP/UDP/ICMP 等)。
       
      ✅ 若只想抓 “目标是 11.*.8*” 的流量,可改为 dst host 11.*.8*
       
      ✅ 若只想抓 “源是 11.*.8*” 的流量,可改为 src host 11.*.8*
  3. 文件大小与停止抓包:
    • 抓包会持续写入 http_https.pcap,直到手动停止(按 Ctrl+C);
    • 若流量大,文件会快速膨胀,建议添加 -G 3600(每小时分割一个文件)或 -W 10(最多保留 10 个文件)限制大小,例如:
      bash
       
      运行
       
       
       
       
      sudo tcpdump -i any "port 9301 or port 9302 or port 80 or host 11.*.8*" -w http_https_%Y%m%d_%H%M%S.pcap -G 3600 -W 10
      
       
       
  4. 查看抓包结果:
    • 实时查看(不保存文件):去掉 -w 参数,直接执行:
      bash
       
      运行
       
       
       
       
      sudo tcpdump -i any "port 9301 or port 9302 or port 80 or host 11.*.8*"
      
       
       
    • 分析保存的 pcap 文件:用 Wireshark 打开(图形化界面,支持过滤 / 解析协议),或用 tcpdump -r http_https.pcap 命令行查看。

常见问题排查

  • 抓不到数据?检查:
    1. 网卡是否正确(-i any 改为具体网卡,如 ip addr 查看网卡名);
    2. 过滤规则是否有误(例如端口是否被防火墙拦截,主机 11.*.8* 是否有通信);
    3. 是否用 sudo 执行(无权限会静默失败,不抓包)。
  • 文件过大?添加 -C 100(每个文件最大 100MB)+ -W 5(最多 5 个文件)自动轮转。

-------------------------------------------------------------------------------

http://www.jsqmd.com/news/68288/

相关文章:

  • 2025年12月土工布,土工膜,土工格栅厂家最新推荐,产能、专利、环保三维数据透视!
  • 2025 年 12 月色谱仪厂家权威推荐榜:气相/离子/便携式/高效色谱仪,精准分析与智能网络化技术深度解析
  • 2025年五大宁波地磅厂商排行榜,看哪家产品质量稳定
  • 2025年度国产超级电容品牌实力榜:国产超级电容哪家靠谱?
  • 2025年五大锅炉冷凝器生产厂排名,看哪家合作案例多
  • 2025年靠谱的U型加热管厂家最新用户好评榜
  • 详细介绍:C++:类和对象---进阶篇
  • 2025年口碑好的网站建设公司推荐:专业靠谱企业全解析
  • 2025年靠谱的橡胶用云母粉厂家选购指南与推荐
  • 2025年铝青铜棒材批发厂家权威推荐榜单:锌白铜管‌/锡磷青铜管‌/锌白铜带源头厂家精选
  • 2025年口碑好的网站建设公司推荐,知名服务商与高性价比企业
  • 第二届数证杯决赛个人赛(除逆向和数据分析)
  • 【技术干货】如何在Vaadin应用程序中使用自定义Figma组件
  • 2025年北京连锁餐饮神秘顾客公司权威推荐榜单:饮品店暗访‌/食品安全暗访‌/酒店餐饮神秘顾客源头公司精选
  • 2025香港留学中介机构
  • iozone的下载编译测试
  • 2025 年 12 月压铸机厂家权威推荐榜:力劲/伊之密/锌合金/铝合金/热室/冷室二手压铸机买卖回收,实力甄选与高效方案解析
  • 2025香港留学中介机构哪家好
  • 2025 年 12 月镁碳砖厂家权威推荐榜:钢包/转炉/电炉专用耐火材料,高耐用性与热震稳定性深度解析
  • 2025香港留学中介机构推荐
  • Excel处理控件Aspose.Cells教程:使用C#在Excel中创建环形图
  • 2025 年 12 月钢结构工程实力厂家权威推荐榜:钢构桥梁、工业厂房、大跨度场馆等全领域施工,精选技术领先与项目口碑标杆企业!
  • 2025香港留学机构排名哪家口碑
  • C# ModBusCRC16校验
  • 2025香港留学中介机构南京有哪些
  • 2025 年 12 月沈阳油漆厂家权威推荐榜:环保工业漆、高端汽车漆、建筑外墙漆,实力工厂源头直供精选
  • 2025 年 12 月沈阳油漆厂家权威推荐榜:环保工业漆、高端汽车漆、建筑外墙漆,实力工厂源头直供精选
  • 2025 年口碑好的陕西树脂瓦实力厂家排行榜
  • 2025年萧山服务好的GEO品牌找哪家,短视频矩阵/GEO优化服务/广告全案策划、制作、发布/GEO优化AI工具排名GEO实力厂家怎么选择
  • 2025年南京高性价比包装盒厂家选择指南:有信誉的包装盒供应