当前位置: 首页 > 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,服务本身拥有权限即可。
  • 确保虚拟环境、环境变量在脚本中正确设置。
http://www.xdnf.cn/news/203797.html

相关文章:

  • ArcPy 中的地理处理工具
  • 打印及判断回文数组、打印N阶数组、蛇形矩阵
  • STL 算法库中的 min_element 和 max_element
  • AI日报 - 2025年04月29日
  • JAVA:线程池
  • 弹性盒子布局
  • 嘉黎县传统手工艺传承与发展交流会圆满举行
  • 【LInux网络】网络层IP协议全面解析
  • 亚马逊低价商城战略全解析:跨境卖家突围价格战的7维作战体系
  • 鸿蒙应用开发 知识点 官网快速定位表
  • 鉴权方案与 Sa-Token(元宝胡编乱造中)
  • 【LaTex】8.2 段落格式
  • 关于codeforces设置中文 以及 插件安装后没显示中文的问题解决
  • 【MQ篇】RabbitMQ之惰性队列!
  • Java——构造方法
  • 数据结构算法竞赛训练网站OJ(Online Judge)
  • el-dialog弹窗关闭时调了两次刷新数据的接口
  • KBEngine 源代码分析(二):协议注册和处理
  • Vue 生命周期钩子总结
  • 【前缀和 差分数组 数论】P6042 「ACOI2020」学园祭|省选-
  • 【DeepSeek认证】最好的MODBUS调试工具
  • 什么是数据链路层的CRC检测以及为什么要放到帧尾?
  • 民办生从零学C的第十二天:指针(1)
  • 探秘Transformer系列之(31)--- Medusa
  • MySQL的数据类型
  • 从灰色地带走向阳光监管的漏洞产业
  • 运维实施27-Linux权限管理
  • 有源医疗器械的安规三项
  • 2025“钉耙编程”中国大学生算法设计春季联赛(8)10031007
  • sql学习笔记(四)