怎么把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
查看实时日志,确认服务启动情况。
二、另外一版本
- 使用编辑器新建文件:
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
,服务本身拥有权限即可。 - 确保虚拟环境、环境变量在脚本中正确设置。