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

news2025/5/24 18:18:06

环境:

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.coloradmin.cn/o/2384782.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python 脚本执行命令的深度探索:方法、示例与最佳实践

在现代软件开发过程中,Python 脚本常常需要与其他工具和命令进行交互,以实现自动化任务、跨工具数据处理等功能。Python 提供了多种方式来执行外部命令,并获取其输出,重定向到文件,而不是直接在终端中显示。这种能力使…

PotPlayer 4K 本地万能影音播放器

今日分享一款来自吾爱论坛大佬分享的啥都能播的的本地播放器,不管是不管是普通视频、4K超清、蓝光3D,还是冷门格式,它基本都能搞定。而且运行流畅不卡顿,电脑配置低也能靠硬件加速,让你根本停不下来。 自带解码器&…

2025年电工杯A题第一版本Q1-Q4详细思路求解+代码运行

A题 光伏电站发电功率日前预测问题 问题背景 光伏发电是通过半导体材料的光电效应,将太阳能直接转化为电能的技术。光伏电站是由众多光伏发电单元组成的规模化发电设施。 光伏电站的发电功率主要由光伏板表面接收到的太阳辐射总量决定,不同季节太阳光…

基于阿里云DashScope API构建智能对话指南

背景 公司想对接AI智能体,用于客服系统,经过调研和实施,觉得DashScope 符合需求。 阿里云推出的DashScope灵积模型服务为开发者提供了便捷高效的大模型接入方案。本文将详细介绍如何基于DashScope API构建一个功能完善的智能对话系统&#x…

九州未来十三载:开源赋能 智启未来

2012年,九州未来以“开源赋能云边变革”为使命,开启中国开放云边基础架构服务的探索之路。十三载坚守深耕,我们始终以开源为翼,以算力为基,在科技浪潮中砥砺前行,见证并推动着AI时代的算力变革。 坚守初心丨…

2025年AI搜索引擎发展洞察:技术革新与市场变革

引言:AI搜索的崛起与市场格局重塑 2024-2025年,AI搜索市场迎来了前所未有的变革期。随着DeepSeek-R1等先进大语言模型的推出,传统搜索引擎、AI原生搜索平台以及各类内容平台纷纷加速智能化转型,推动搜索技术从基础信息检索向深度…

dify调用Streamable HTTP MCP应用

一、概述 上一篇文章,介绍了使用python开发Streamable HTTP MCP应用,链接:https://www.cnblogs.com/xiao987334176/p/18872195 接下来介绍dify如何调用MCP 二、插件 安装插件 需要安装2个插件,分别是:Agent 策略(支持 …

HCIP实验五

一、实验拓扑图: 二、实验需求分析: 1. PreVal策略:要求确保R4通过R2到达192.168.10.0/24 ,需在R4上针对去往该网段路由配置PreVal策略,为经R2的路径赋予更高优先值,影响本地路由表选路。 2. AS Path策略…

vivado fpga程序固化

一般下载到fpga上的程序在掉电之后就会丢失,如果想要掉电之后程序不丢失,就需要将比特流文件固化到板载的flash上。 以下以我的7a100t开发板为例,介绍程序固化的流程 点击OK就可以下载了。 一个奇怪的问题 有一次我的一个工程固化之后&…

OpenCV CUDA模块图像特征检测与描述------图像中快速检测特征点类cv::cuda::FastFeatureDetector

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 cv::cuda::FastFeatureDetector 是 OpenCV 的 CUDA 加速模块中的一部分,用于在图像中快速检测特征点。FAST(Features fro…

SpringMVC(结合源码浅析工作流程)

SpringMVC 概念 Spring MVC 是基于前端控制器(Front Controller)设计模式的 Web 框架,在 Web 应用中指一个统一的入口,用来接收所有客户端请求,并统一进行分发、处理。在 SpringMVC 中,前端控制器就是 Di…

学习STC51单片机13(芯片为STC89C52RC)

我去,兄弟们我们今天来学习一个牛逼 的硬件,它叫超声波测距模块HC—SR04 硬件:HC—SR04 哎,想当初最想要玩的就是这个模块,科技感十足,那现在就让我们玩玩吧 超声波测距传感器 原理就是说需要给Trig 10u…

Claude 4 系列 Opus 4 与 Sonnet 4正式发布:Claude 4新特性都有哪些?

随着 Claude 4 系列(Opus 4 与 Sonnet 4)的正式发布,Anthropic 把自家大模型从“会聊天”推进到“能当自主代理”──不仅推理更深、上下文更长,还内置代码执行、多模态理解、工具调用等一揽子全新能力;同时&#xff0…

深度“求索”:DeepSeek+Dify构建个人知识库

目录 前言 环境部署 安装Docker 安装Dify 配置Dify 部署知识库 创建应用 前言 在当今数字化信息爆炸的时代,数据隐私和个性化知识管理成为企业和个人关注的焦点。Dify,作为一款备受瞩目的开源 AI 应用开发平台,为用户提供了完整的私有…

基于R语言的空间异质性数据分析技术

在自然和社会科学领域,存在大量与地理或空间相关的数据,这些数据通常具有显著的空间异质性。传统的统计学方法在处理这类数据时往往力不从心。基于R语言的一系列空间异质性数据分析方法,如地理加权回归(GWR)、地理加权…

网络学习-TCP协议(七)

一、TCP协议 TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。 1、三次握手 客户端: 1、先发起连接,发送SYN置1,seqnum12345(随机值)----半连接…

基于微信小程序的高校校园微活动管理系统设计与实现(源码+定制+开发)高校微信小程序校园活动发布与互动平台开发 面向大学生群体的校园活动移动平台设计与实现

博主介绍: ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台…

云计算与大数据进阶 | 27、存储系统如何突破容量天花板?可扩展架构的核心技术与实践—— 分布式、弹性扩展、高可用的底层逻辑(上)

数据中心里,存储系统是至关重要的组成部分。由于相关硬件组件与存储操作系统的多样性和复杂性,如何在保证存储稳定、安全、可靠的同时,实现灵活扩展和自服务,一直是困扰数据中心全面云化的难题。 简单来说,现在的难题…

IvorySQL-WASM:免安装的数据库探索之旅

简介 为了降低社区用户的使用门槛,提升使用体验,IvorySQL 社区特别推出了 IvorySQL-WASM 项目,帮助用户快速在线 Demo。 IvorySQL-WASM 基于开源的 Postgres-WASM 框架开发。它允许用户直接在网页浏览器中体验 IvorySQL,无需本地…

飞牛fnNAS远程映射盘符

目录 一、NAS、PC端配置Zerotier 二、使用网上邻居 三、使用WebDAV 1.开启WebDAV 2.PC上安装RaiDrive并设置 如果能将NAS作为本机一个盘符来使用,一定会令我非常方便。如果是本地,可以很方便实现。 将飞牛NAS映射为本地盘符,常用两种方式,一种是网上邻居,另一种是We…