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

使用Screen命令发送quit指令关闭L4D2服务器时回车无效的问题求助

L4D2服务器脚本关闭无响应问题解决

问题重现

使用Bash脚本结合Monit管理L4D2服务器时,执行以下命令无法正常关闭服务器:

#!/bin/bash

screen -S l4d22 -p 0 -X stuff "quit\n"

执行后可见Screen窗口中已输入"quit"并换行,但服务器无响应;手动在Screen中执行相同操作则正常生效。

解决方案

1. 修正换行符解析问题

Bash中双引号内的\n可能未被正确解析为换行符,改用ANSI-C引号($'')让bash直接解析转义字符:

screen -S l4d22 -p 0 -X stuff $'quit\n'

部分游戏服务器终端期望回车符为\r,也可尝试:

screen -S l4d22 -p 0 -X stuff $'quit\r'

2. 分离命令与回车发送

如果上述方法无效,可拆分两步发送:先输入命令,再单独发送换行符:

screen -S l4d22 -p 0 -X stuff "quit"
sleep 0.5
screen -S l4d22 -p 0 -X stuff $'\n'

添加sleep是为了确保命令输入完成后再发送回车,避免时序问题。

3. 确认用户权限一致性

Monit默认以root用户运行,而你的L4D2服务器screen会话可能是普通用户创建的。需在Monit配置中指定运行脚本的用户与screen会话所属用户一致:

check process l4d2 with pidfile /path/to/l4d2.pid
    start program = "/path/to/start_script.sh" as user your_username
    stop program = "/path/to/stop_script.sh" as user your_username

替换your_username为实际启动screen会话的用户。

4. 验证screen会话的可访问性

在脚本中添加screen会话列表检查,确保Monit执行时能找到目标会话:

#!/bin/bash
# 先列出当前screen会话,排查是否存在目标会话
screen -list
# 再执行关闭命令
screen -S l4d22 -p 0 -X stuff $'quit\n'

如果Monit日志中看不到目标会话,说明用户权限或环境变量问题,需调整Monit的运行环境。

内容的提问来源于stack exchange,提问作者R4pt0r

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 10:27:11