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

有两个Python脚本都在虚拟环境下运行,怎么打包成一个系统服务,按照顺序启动?

环境:

SEMCP

searx.webapp

python

问题描述:

有两个python脚本都在虚拟环境下运行,怎么打包成一个系统服务,按照顺序启动?

在这里插入图片描述

解决方案:

将这两个 Python 脚本打包成有启动顺序的系统服务,最常用的方法是在 Linux 系统上使用 systemd 来管理它们。将创建两个 systemd 服务单元文件,一个用于 searx.webapp,一个用于 SEMCP.py,并通过配置依赖关系确保 searx.webapp 先启动并运行稳定后,自动再启动 SEMCP.py

希望使用 root 用户运行(注意:在生产环境中通常不建议使用 root 用户运行服务,应创建专用用户以提高安全性)。

步骤 1: 创建 SearXNG Webapp 的 systemd 服务文件

创建一个名为 searxng-webapp.service 的文件,放在 /etc/systemd/system/ 目录下。

sudo nano /etc/systemd/system/searxng-webapp.service

将以下内容粘贴到文件中:

[Unit]
Description=SearXNG Web Application
After=network.target
Wants=semcp.service[Service]
Type=simple
User=root
Group=root
WorkingDirectory=/mnt/program/Qwen3/searxng
# 修改 ExecStart 如下
ExecStart=/bin/bash -c '\source /root/miniconda/etc/profile.d/conda.sh && \conda activate qwen3_env && \exec python -m searx.webapp' # 注意这里激活环境后直接使用 python 命令即可
Restart=always
RestartSec=5[Install]
WantedBy=multi-user.target

保存并关闭文件。

步骤 2: 创建 SEMCP 脚本的 systemd 服务文件

创建一个名为 semcp.service 的文件,放在 /etc/systemd/system/ 目录下。

sudo nano /etc/systemd/system/semcp.service

将以下内容粘贴到文件中:

[Unit]
Description=SearXNG SEMCP Service
After=network.target searxng-webapp.service # 假设它依赖 webapp[Service]
Type=simple
User=root
Group=root
WorkingDirectory=/mnt/program/Qwen3/searxng/searx
# 修改 ExecStart 如下
ExecStart=/bin/bash -c '\source /root/miniconda/etc/profile.d/conda.sh && \conda activate qwen3_env && \exec python SEMCP.py' # 注意这里激活环境后直接使用 python 命令即可
Restart=always
RestartSec=5[Install]
WantedBy=multi-user.target

保存并关闭文件。

关键点解释:

  • [Unit] 部分定义了服务的元信息和依赖关系。
    • After=network.target network-online.targetRequires= (在 semcp.service 中) 指定了服务的启动顺序和依赖。semcp.service 中的 After=searxng-webapp.serviceRequires=searxng-webapp.service 明确告诉 systemd,semcp.service 必须在 searxng-webapp.service 启动 之后 才能启动,并且依赖于它的成功启动。
  • [Service] 部分定义了如何运行服务。
    • UserGroup 指定了运行服务的用户和组。请根据实际情况和安全需求修改。
    • WorkingDirectory 指定了脚本执行时所在的目录。这对于 searx.webapp 需要在 SearXNG 根目录运行,而 SEMCP.py 需要在其所在目录运行的情况非常重要。
    • ExecStart 指定了服务的启动命令。我们直接调用虚拟环境中的 python 解释器来执行相应的模块或脚本。
    • Restart=on-failure 会让 systemd 在脚本非正常退出时自动重启服务。
    • StandardOutput=syslogStandardError=syslog 将服务的输出信息发送到系统日志(可以通过 journalctl 查看),方便调试。
  • [Install] 部分定义了服务如何被 systemd 启用。
    • WantedBy=multi-user.target 意味着当系统进入多用户运行级别时,此服务会被启动。

步骤 3: 重新加载 systemd 配置

创建或修改服务文件后,需要让 systemd 重新加载配置:

sudo systemctl daemon-reload

步骤 4: 启用服务(设置开机自启)

如果您希望服务在系统启动时自动运行,需要启用它们:

sudo systemctl enable searxng-webapp.service
sudo systemctl enable semcp.service

由于 semcp.service 依赖于 searxng-webapp.service,启用 semcp.service 也会间接确保 searxng-webapp.service 在启动序列中。

步骤 5: 启动服务

现在可以手动启动服务了。启动 semcp.service 会因为依赖关系自动先启动 searxng-webapp.service

sudo systemctl start semcp.service
# 或者分开启动,先启动webapp,再启动semcp:
# sudo systemctl start searxng-webapp.service
# sudo systemctl start semcp.service

步骤 6: 检查服务状态和日志

检查服务是否正常运行:

sudo systemctl status searxng-webapp.service
sudo systemctl status semcp.service

查看服务的详细日志(用于调试):

sudo journalctl -u searxng-webapp.service -f # -f 参数可以实时跟踪日志
sudo journalctl -u semcp.service -f

在这里插入图片描述
重要提示:

  1. 路径准确性: 请务必检查 /mnt/program/Qwen3/qwen3_env/bin/python/mnt/program/Qwen3/searxng/mnt/program/Qwen3/searxng/searx/SEMCP.py 这些路径是否准确无误。
  2. 权限问题: 确保运行服务的用户(这里是 root)对虚拟环境目录、SearXNG 目录、SEMCP.py 脚本及其可能读写的任何文件或目录拥有读、写、执行权限。
  3. SearXNG 启动时间: After=searxng-webapp.service 只保证 searxng-webapp 的进程启动了,不保证它已经完全初始化并开始监听端口。如果 SEMCP.py 启动太快导致连接 SearXNG 失败,您可能需要在 semcp.service[Service] 部分添加 ExecStartPre=/bin/sleep 10 (等待10秒) 或者编写一个更复杂的健康检查脚本来确保 SearXNG 可用后再启动 SEMCP.py
  4. 安全性: 强烈建议为服务创建一个专用的低权限用户,而不是使用 root。

通过以上步骤,您就可以将两个 Python 脚本配置为由 systemd 管理的系统服务,并确保它们按照所需的顺序启动。

http://www.lryc.cn/news/2384782.html

相关文章:

  • 【Linux cmd】查找进程信息
  • 与网格共舞 - 服务网格的运维与问题排查 (Istio 实例)
  • Python 脚本执行命令的深度探索:方法、示例与最佳实践
  • PotPlayer 4K 本地万能影音播放器
  • 2025年电工杯A题第一版本Q1-Q4详细思路求解+代码运行
  • 基于阿里云DashScope API构建智能对话指南
  • HOW - 基于组件库组件改造成自定义组件基本规范
  • 九州未来十三载:开源赋能 智启未来
  • 2025年AI搜索引擎发展洞察:技术革新与市场变革
  • dify调用Streamable HTTP MCP应用
  • HCIP实验五
  • java将图片转Base64字符串存储mysql数据库
  • 题目 3330: 蓝桥杯2025年第十六届省赛真题-01 串
  • 初识 Flask 框架
  • MYSQL故障排查和环境优化
  • vivado fpga程序固化
  • OpenCV CUDA模块图像特征检测与描述------图像中快速检测特征点类cv::cuda::FastFeatureDetector
  • SpringMVC(结合源码浅析工作流程)
  • 学习STC51单片机13(芯片为STC89C52RC)
  • Claude 4 系列 Opus 4 与 Sonnet 4正式发布:Claude 4新特性都有哪些?
  • Swagger API 未授权访问漏洞【原理扫描】修复
  • 深度“求索”:DeepSeek+Dify构建个人知识库
  • 基于R语言的空间异质性数据分析技术
  • C++:动态刷新打印内容
  • 网络学习-TCP协议(七)
  • 基于微信小程序的高校校园微活动管理系统设计与实现(源码+定制+开发)高校微信小程序校园活动发布与互动平台开发 面向大学生群体的校园活动移动平台设计与实现
  • Python 项目中安装 OpenAI 库的详细指南
  • 云计算与大数据进阶 | 27、存储系统如何突破容量天花板?可扩展架构的核心技术与实践—— 分布式、弹性扩展、高可用的底层逻辑(上)
  • 使用Gemini, LangChain, Gradio打造一个书籍推荐系统 (第二部分)
  • IvorySQL-WASM:免安装的数据库探索之旅