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

怎么把Ubuntu系统虚拟环境中启动命令做成系统服务可以后台运行?

环境:

Ubuntu20.04

xinference

问题描述:

怎么把Ubuntu系统虚拟环境中启动命令做成系统服务可以后台运行,每次要这么启动程序

sudo -icd /mnt/program/conda activate xinference_env2XINFERENCE_MODEL_SRC=modelscope CUDA_VISIBLE_DEVICES=0 xinference-local --host 0.0.0.0 --port 9997

解决方案:

1.查看conda路径

which conda

/root/miniconda/bin/conda

2.根据此路径, conda 安装目录应该是 /root/miniconda,相应的初始化脚本在:

/root/miniconda/etc/profile.d/conda.sh

3.用 root 用户启动,编辑xinference.service

nano /etc/systemd/system/xinference.service

[Unit]
Description=Xinference Service
After=network.target[Service]
Type=simple
User=root
WorkingDirectory=/mnt/program
Environment=XINFERENCE_MODEL_SRC=modelscope
Environment=CUDA_VISIBLE_DEVICES=0
ExecStart=/bin/bash -c '\source /root/miniconda/etc/profile.d/conda.sh && \conda activate xinference_env2 && \exec xinference-local --host 0.0.0.0 --port 9997'
Restart=always
RestartSec=5[Install]
WantedBy=multi-user.target

在这里插入图片描述

4.启动测试

  • 确保 /mnt/program 路径存在,且 root 用户有权限访问。
  • 确保环境 xinference_env2 已经创建且可用。
  • 保存文件后执行:
sudo systemctl daemon-reload
sudo systemctl start xinference

开机自启:

sudo systemctl enable xinference

重启:

sudo systemctl restart xinference
  • sudo journalctl -u xinference -f 查看实时日志,确认服务启动情况。

在这里插入图片描述

二、另外一版本

  1. 使用编辑器新建文件:
sudo nano /etc/systemd/system/ragflow.service
  1. 写入以下内容:
[Unit]
Description=Ragflow Backend Service
After=network.target[Service]
Type=simple
User=root
WorkingDirectory=/home/www/ragflow/ragflow
Environment=PYTHONPATH=/home/www/ragflow/ragflow
Environment=NLTK_DATA=/home/www/ragflow/ragflow/nltk_data
ExecStart=/bin/bash -c '\source /home/www/ragflow/ragflow/.venv/bin/activate && \bash docker/launch_backend_service.sh'
Restart=always
RestartSec=5[Install]
WantedBy=multi-user.target

在这里插入图片描述

说明

  • User=root:请替换成您希望运行该服务的用户,确保该用户对相关目录有读写和执行权限。
  • WorkingDirectory 用来指定进入的目录,相当于 cd
  • Environment=PYTHONPATH=... 设置环境变量。
  • ExecStart 里先用 bash 执行激活虚拟环境的命令,再执行后续的启动脚本。
  • Restart=alwaysRestartSec=5 保证服务异常退出后自动重启,5秒后重启。

启用服务

执行以下命令:

sudo systemctl daemon-reload
sudo systemctl enable ragflow.service
sudo systemctl start ragflow.service

然后查看状态和日志确认是否启动正常:

sudo systemctl status ragflow.service
sudo journalctl -u ragflow.service -f

在这里插入图片描述

额外提示

  • 如果 docker/launch_backend_service.sh 脚本本身启动了守护进程(daemonize),可能需要将 Type 改为 forking 或根据脚本特性调整。
  • 如果启动脚本依赖其他环境变量或路径,也可以在服务文件中用 Environment= 添加。
  • 确保 .venv/bin/activate 文件权限正常,且虚拟环境无误。

启动命令做成系统服务:sudo -i  cd/mnt/code/ragflow 在按順序执行source .venv/bin/activate             export PYTHONPATH=$(pwd)               bash docker/entrypoint.sh 

你要把一组命令做成系统服务启动,核心是将这些命令写到一个可执行脚本里,再用 systemd 创建服务单元来管理它。


你给的命令是:

sudo -i
cd /mnt/code/ragflow
source .venv/bin/activate
export PYTHONPATH=$(pwd)
bash docker/entrypoint.sh

正确写法及注意点

  1. sudo -i 是切换为 root 的交互式 shell,不适合写入服务脚本。服务运行时一般由 root(或指定用户)执行,无需再切换。

  2. 环境变量和激活虚拟环境需要写到脚本里。

  3. source 是 bash 内置,脚本需用 bash 解释。


推荐步骤

1. 写一个启动脚本 /usr/local/bin/ragflow-start.sh

#!/bin/bash
cd /mnt/code/ragflow || exit 1# 激活虚拟环境
source .venv/bin/activate# 设置环境变量
export PYTHONPATH=$(pwd)# 启动主程序(保持前台运行)
exec bash docker/entrypoint.sh

说明:

  • exec 替换当前 shell 进程,方便 systemd 管理。
  • 加上 || exit 1 防止目录不存在导致意外执行后续命令。
  • 脚本需赋予执行权限:
chmod +x /usr/local/bin/ragflow-start.sh

2. 编写 systemd 服务文件, /etc/systemd/system/ragflow.service

[Unit]
Description=Ragflow Service
After=network.target[Service]
Type=simple
User=root
WorkingDirectory=/mnt/code/ragflow
ExecStart=/usr/local/bin/ragflow-start.sh
Restart=on-failure[Install]
WantedBy=multi-user.target

说明:

  • User=root 如需使用其他用户,改成对应用户名。
  • Restart=on-failure 出错自动重启。
  • WorkingDirectory 可留空,因为脚本内已切换目录,但写上更安全。

3. 启用并启动服务

sudo systemctl daemon-reload
sudo systemctl enable ragflow.service
sudo systemctl start ragflow.service

4. 查看服务状态和日志

sudo systemctl status ragflow.service
sudo journalctl -u ragflow.service -f

总结

  • 把启动命令写入单独脚本。
  • 用 systemd 调用这个脚本,管理进程生命周期。
  • 避免使用 sudo -i,服务本身拥有权限即可。
  • 确保虚拟环境、环境变量在脚本中正确设置。

相关文章:

  • 【“星瑞” O6 评测】 — llm CPU部署对比高通骁龙CPU
  • Flutter 学习之旅 之 flutter 作为 module ,在 Android 端主动唤起 Flutter 开发的界面 简单的整理
  • DBeaver CE 24.1.3 (Windows 64位) 详细安装教程
  • .net 常用
  • 基于C++实现人工智能—五子棋的目标识别
  • Google在架ab包分析-巴西
  • 阿里云服务器dns怎么修改服务器地址?服务器dns怎么设置??
  • MTK Android12-13 App卸载加锁
  • 基于 Java 的实现前端组装查询语句,后端直接执行查询方案,涵盖前端和后端的设计思路
  • 如何搭建spark yarn 模式的集群集群
  • java 和 C#操作数据库对比
  • Web基础和HTTP协议
  • kvm学习小结
  • 计算机视觉——通过 OWL-ViT 实现开放词汇对象检测
  • Java垃圾收集器与内存分配策略深度解析
  • php数据库连接
  • Linux常见基础命令
  • Leetcode - 双周赛155
  • 超级好用的​​参数化3D CAD 建模​​图形库 (CadQuery库介绍)
  • 数字孪生的浪潮:从虚拟镜像到现实世界的 IT 变革
  • 2025中国南昌国际龙舟赛5月23日启幕,是历年来南昌举办的最高规格龙舟赛事
  • 体坛联播|曼联热刺会师欧联杯决赛,多哈世乒赛首日赛程出炉
  • 苹果Safari浏览器上的搜索量首次下降
  • 技术派|伊朗展示新型弹道导弹,美“萨德”系统真的拦不住?
  • 花20万骑自行车?CityRide带火“骑行经济”
  • 中国证监会印发《推动公募基金高质量发展行动方案》