You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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关联,避免子进程因等待输入输出而挂起

额外排查优化点

  1. 权限验证:确保Discord机器人运行用户拥有执行sudo -u mc-user的免密权限(可通过sudoers文件配置)
  2. 环境变量一致性:手动运行脚本时的环境变量可能与机器人进程不同,可在run.sh开头显式声明PATH等必要变量
  3. 错误调试:若问题未解决,可临时将输出重定向到日志文件排查隐藏错误:
# 临时调试用,替换重定向代码
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 16:05:20