如何在Python Discord Bot中启动完全独立的Minecraft服务器进程?
解决Discord机器人启动Minecraft服务器进程无法独立运行的问题
核心解决方案
在Python代码中调用run.sh时,必须让子进程完全脱离Discord机器人的进程上下文,避免因父进程的IO绑定、会话关联导致进程无法独立存活。直接使用以下修改后的启动逻辑即可解决问题:
修改Python中的启动代码
替换原启动部分的代码为:
import subprocess import os # ... 原有代码逻辑 ... if server == "blox-smp": cmd = "/var/mc-servers/blox_smp_1/run.sh y" # 启动完全独立的子进程 subprocess.Popen( cmd, shell=True, stdout=open(os.devnull, 'w'), stderr=open(os.devnull, 'w'), stdin=open(os.devnull, 'r'), start_new_session=True, preexec_fn=os.setpgrp )
参数作用说明
start_new_session=True:为子进程创建独立会话,脱离父进程的会话组控制preexec_fn=os.setpgrp:设置新的进程组ID,防止父进程收到终止信号时牵连子进程- 重定向
stdin/stdout/stderr到/dev/null:切断子进程与父进程的IO关联,避免子进程因等待输入输出而挂起
额外排查优化点
- 权限验证:确保Discord机器人运行用户拥有执行
sudo -u mc-user的免密权限(可通过sudoers文件配置) - 环境变量一致性:手动运行脚本时的环境变量可能与机器人进程不同,可在
run.sh开头显式声明PATH等必要变量 - 错误调试:若问题未解决,可临时将输出重定向到日志文件排查隐藏错误:
# 临时调试用,替换重定向代码 stdout=open("/tmp/mc_start.log", 'w'), stderr=open("/tmp/mc_start_err.log", 'w'),
验证方式
执行机器人命令后,通过以下命令确认进程状态:
sudo -u mc-user screen -ls | grep blox_smp_1_screen ps aux | grep java | grep paper.jar
内容的提问来源于stack exchange,提问作者Nater0214
相关产品推荐
相关产品推荐

