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

有两个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 管理的系统服务,并确保它们按照所需的顺序启动。

相关文章:

  • linux ptrace 图文详解(九) gdb如何判断被tracee唤醒的原因
  • 数字计数--数位dp
  • 文章记单词 | 第113篇(六级)
  • 反向海淘物流难题如何破解?
  • 文章记单词 | 第105篇(六级)
  • 动态库和静态库详解
  • 从数学融智学视域系统地理解《道德经》:前三十七章,道法自然
  • C语言中的文件I/O
  • 单目视觉测量及双目视觉测量
  • 【软件安装】Windows操作系统中安装mongodb数据库和mongo-shell工具
  • 【AUTOSAR网络管理】T_NM_Timeout参数测试指南
  • 10G SFP+ 双纤光模块选购避坑指南:从SFP-10G-LRM到SFP-10G-ZR的兼容性与应用
  • 八股--SSM(2)
  • 【通用智能体】smolagents/open_deep_research:面向开放式研究的智能体开发框架深度解析
  • STM32 CubeMX时钟配置PWM信号输出
  • SOC-ESP32S3部分:8-GPIO输出LED控制
  • 辐射发射RE测试
  • 生成模型——扩散模型(Diffusion Model)
  • LoRA(Low-Rank Adaptation)
  • 从JDK 8到JDK 17的主要变化
  • 贴吧网站建设/中国新闻网发稿
  • 微博网站开发/长沙全网覆盖的网络推广
  • 我的世界服务器网站怎么做/百度网页版进入
  • 网站做电子公章违法吗/大一网页设计作业成品
  • 做3d动画网站/百度 营销中心
  • qq是腾讯旗下的吗/吉林网络seo