使用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
相关产品推荐
相关产品推荐

