环境:
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查看实时日志,确认服务启动情况。

二、另外一版本
- 使用编辑器新建文件:
sudo nano /etc/systemd/system/ragflow.service
- 写入以下内容:
[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=always和RestartSec=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
正确写法及注意点
-
sudo -i是切换为 root 的交互式 shell,不适合写入服务脚本。服务运行时一般由 root(或指定用户)执行,无需再切换。 -
环境变量和激活虚拟环境需要写到脚本里。
-
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 的启动信息。如果启动失败,日志将显示具体的错误原因。
Ubuntu虚拟环境启动命令转系统服务
452

被折叠的 条评论
为什么被折叠?



