有两个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.target
和Requires=
(在semcp.service
中) 指定了服务的启动顺序和依赖。semcp.service
中的After=searxng-webapp.service
和Requires=searxng-webapp.service
明确告诉 systemd,semcp.service
必须在searxng-webapp.service
启动 之后 才能启动,并且依赖于它的成功启动。
[Service]
部分定义了如何运行服务。User
和Group
指定了运行服务的用户和组。请根据实际情况和安全需求修改。WorkingDirectory
指定了脚本执行时所在的目录。这对于searx.webapp
需要在 SearXNG 根目录运行,而SEMCP.py
需要在其所在目录运行的情况非常重要。ExecStart
指定了服务的启动命令。我们直接调用虚拟环境中的python
解释器来执行相应的模块或脚本。Restart=on-failure
会让 systemd 在脚本非正常退出时自动重启服务。StandardOutput=syslog
和StandardError=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
重要提示:
- 路径准确性: 请务必检查
/mnt/program/Qwen3/qwen3_env/bin/python
,/mnt/program/Qwen3/searxng
,/mnt/program/Qwen3/searxng/searx/SEMCP.py
这些路径是否准确无误。 - 权限问题: 确保运行服务的用户(这里是 root)对虚拟环境目录、SearXNG 目录、SEMCP.py 脚本及其可能读写的任何文件或目录拥有读、写、执行权限。
- SearXNG 启动时间:
After=searxng-webapp.service
只保证searxng-webapp
的进程启动了,不保证它已经完全初始化并开始监听端口。如果SEMCP.py
启动太快导致连接 SearXNG 失败,您可能需要在semcp.service
的[Service]
部分添加ExecStartPre=/bin/sleep 10
(等待10秒) 或者编写一个更复杂的健康检查脚本来确保 SearXNG 可用后再启动SEMCP.py
。 - 安全性: 强烈建议为服务创建一个专用的低权限用户,而不是使用 root。
通过以上步骤,您就可以将两个 Python 脚本配置为由 systemd 管理的系统服务,并确保它们按照所需的顺序启动。