Linux中用Screen内While True循环监控另一个Screen进程失败求助
问题分析与修复方案
核心问题
你的命令存在两个关键问题,导致myservermonitor会话异常终止或无法正常工作:
- grep匹配范围过宽:
screen -list会列出所有screen会话,包括你创建的myservermonitor,grep "myserver"会误匹配到这个监控会话,导致逻辑判断错误,永远不会启动myserver;如果启动逻辑未触发但脚本存在其他错误(比如无意义的"$@"参数或文件路径错误),会直接导致bash脚本退出,会话终止。 - 冗余的
"$@"参数:bash -c执行时你没有传递任何额外参数,"$@"展开为空,不仅对启动命令无帮助,还可能引发潜在的参数解析问题。
修复后的命令
screen -dmS myservermonitor bash -c \ 'while true; do # 精确匹配myserver会话,避免误识别myservermonitor if ! screen -list | grep -q "\.myserver$"; then # 后台启动myserver会话,无需交互 screen -dmS myserver java \ @user_jvm_args.txt \ @libraries/net/minecraftforge/forge/1.18.2-40.2.10/unix_args.txt fi sleep 15 done'
关键改进点
- 精确匹配会话:screen会话的格式为
PID.会话名,用grep -q "\.myserver$"只匹配后缀为.myserver的会话,彻底避免误判myservermonitor。 - 后台启动目标会话:给启动
myserver的命令添加-dm参数,让它在后台创建会话,无需交互环境,避免启动失败。 - 移除冗余参数:直接删除无意义的
"$@",简化命令逻辑。
验证步骤
- 执行修复后的命令创建监控会话
- 检查监控会话是否正常运行:
screen -list | grep myservermonitor - 手动终止
myserver会话,等待15秒后检查是否自动重启:screen -S myserver -X quit sleep 16 screen -list | grep myserver
内容的提问来源于stack exchange,提问作者tjordan
相关产品推荐
相关产品推荐

