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

Ubuntu虚拟环境启动命令转系统服务

环境:

Ubuntu20.04

xinference

问题描述:

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

sudo -i

cd /mnt/program/

conda activate xinference_env2

XINFERENCE_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,服务本身拥有权限即可。
  • 确保虚拟环境、环境变量在脚本中正确设置。

另外一个案例

ubuntu@VM-0-2-ubuntu:~$ sudo -i
(base) root@VM-0-2-ubuntu:~# cd /mnt/program/Qwen2.5-VL
(base) root@VM-0-2-ubuntu:/mnt/program/Qwen2.5-VL# conda activate qwen_env
(qwen_env) root@VM-0-2-ubuntu:/mnt/program/Qwen2.5-VL# 

CUDA_VISIBLE_DEVICES=0,1 nohup sh -c 'VLLM_USE_MODELSCOPE=true VLLM_ALLOW_LONG_MAX_MODEL_LEN=1 vllm serve "/root/.cache/modelscope/hub/models/Qwen/Qwen3-32B-FP8" --host 0.0.0.0 --port 8700 --gpu-memory-utilization 0.9 --max-num-seqs 200 --served-model-name "Qwen3-32B-FP8" --max-model-len 8192 --tensor-parallel-size 2 --enable-auto-tool-choice --tool-call-parser hermes' > vllm.log 2>&1 &

步骤 1:创建服务文件

使用 root 权限创建一个新的服务文件,例如 /etc/systemd/system/qwen-vllm.service:

sudo nano /etc/systemd/system/qwen-vllm.service

步骤 2:编辑服务文件内容

将以下内容粘贴到打开的文件中:

[Unit]
Description=Qwen-VLLM Server
After=network.target

[Service]
Type=simple
User=root
Group=root
WorkingDirectory=/mnt/program/Qwen2.5-VL
Environment="CUDA_VISIBLE_DEVICES=0,1"
Environment="VLLM_USE_MODELSCOPE=true"
Environment="VLLM_ALLOW_LONG_MAX_MODEL_LEN=1"
Environment="VLLM_LOGGING_LEVEL=DEBUG"#开启debug日志

# 激活 conda 环境并执行 vllm serve 命令
# 注意:请根据您的实际 conda 安装路径修改 /root/miniconda3/etc/profile.d/conda.sh
ExecStart=/bin/bash -c '\
  source /root/miniconda/etc/profile.d/conda.sh && \
  conda activate qwen_env && \
  exec vllm serve "/root/.cache/modelscope/hub/models/Qwen/Qwen3-32B-FP8" \
  --host 0.0.0.0 \
  --port 8700 \
  --gpu-memory-utilization 0.9 \
  --max-num-seqs 200 \
  --served-model-name "Qwen3-32B-FP8" \
  --max-model-len 8192 \
  --tensor-parallel-size 2 \
  --enable-auto-tool-choice \
  --tool-call-parser hermes'

Restart=on-failure
RestartSec=10

[Install]
WantedBy=multi-user.target

请注意并检查以下几点:

WorkingDirectory: 确保 /mnt/program/Qwen2.5-VL 是您想要的工作目录。
User 和 Group: 设置为 root,因为原始命令使用了 sudo -i 并且模型路径在 /root 下。
Environment: 环境变量通过 Environment 指令设置,比在 ExecStart 内部设置更清晰。
ExecStart:

使用了 /bin/bash -c '...' 来执行一个 shell 命令字符串。
source /root/miniconda3/etc/profile.d/conda.sh: 这是最关键的地方之一。 您需要将 /root/miniconda3/etc/profile.d/conda.sh 替换为您实际安装 conda 的用户(这里是 root)的 conda.sh 

文件路径。如果您不确定,通常在 conda 安装目录下的 etc/profile.d/conda.sh。
conda activate qwen_env: 激活您的 qwen_env 环境。
exec vllm serve ...: exec 命令确保 vllm serve 进程替换掉 bash 进程,这样 systemd 就能直接跟踪 vllm serve 进程。vllm serve 命令及其所有参数与您原命令中 '...' 内部的部分相同。
Restart=on-failure: 如果服务因为错误退出,systemd 会尝试重启它。
WantedBy=multi-user.target: 这使得服务在系统启动到多用户运行级别时启动。

设置大token


系统服务里面写法
--rope-scaling '{\"rope_type\":\"yarn\",\"factor\":4.0,\"original_max_position_embeddings\":32768}' \
  --max-model-len 20480 \

步骤 3:保存文件

在 nano 编辑器中,按 Ctrl + X,然后按 Y 确认保存,最后按 Enter 确认文件名。

步骤 4:重新加载 systemd 配置

让 systemd 知道有一个新的服务文件:

sudo systemctl daemon-reload

步骤 5:启用服务 (可选,如果希望开机自启)

如果您希望服务在服务器启动时自动运行:

sudo systemctl enable qwen-vllm.service

步骤 6:启动服务

立即启动服务:

sudo systemctl start qwen-vllm.service

步骤 7:检查服务状态和日志

检查服务是否成功启动:

sudo systemctl status qwen-vllm.service

查看服务的实时日志输出(这可以帮助您调试如果服务启动失败):

sudo journalctl -u qwen-vllm.service -f

如果一切顺利,应该会看到服务处于 active (running) 状态,并且日志中显示 vllm serve 的启动信息。如果启动失败,日志将显示具体的错误原因。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

玩人工智能的辣条哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值