我一直在尝试为 Minecraft 服务器设置自动备份系统,但在使用屏幕时遇到了问题,特别是在使用“screen -r sessionname -X“/var/minecraft/somebatchfile””时,没有任何反应。
目前我的流程有点像这样:
screen -m -d -S minecraft /var/minecraft/bin/server_nogui.sh
这将毫无问题地启动我的世界服务器。然而,问题是即使像这样简单的后续操作也会失败:
screen -r minecraft -X "stop"
我没有收到错误消息或成功消息,并且服务器实际上并没有像应该那样断开客户端连接并关闭。我认为我做错了什么,但我不知道是什么。我犯了一些明显的错误吗?我读过一点手册页,但我自己没能弄清楚。
答案1
你必须给参数-X
一个screen
命令,我想你想将一个minecraft-server命令“填充”到screen
会话中。
screen -r minecraft -p 0 -X stuff "stop $(printf '\r')"
发送printf
一个回车符,因此命令“stop”被执行。-p 0
确保字符是发送到初始屏幕窗口。
要发送它,ssh
您必须将命令括起来" "
(您也可以使用` `
,但这不会让您进行命令替换)。
ssh -t -i ~/.ssh/id_dsa server_user@server_address "screen -r minecraft -X stuff "even other_server_name is getting in on the action\! $(echo -ne '\r')""
请注意,这!
是一个保留字,你必须转义它。
也是可能的将用户生成的换行符包含到命令中以执行它:
ssh -t -i ~/.ssh/id_dsa server_user@server_address "screen -r minecraft -X stuff 'even other_server_name is getting in on the action!
'"
!
这里没有必要逃避。
答案2
正如我们发现的这个类似的问题,屏幕在向从未附加的会话发送密钥时出现问题。如果您曾经附加过,则默认窗口窗格将设置为零,否则它将默默地失败,因为击键不会进入窗口。你可以避免这种情况通过添加一个-p 0
参数到您的屏幕命令。
或者,您可以使用行为更好的tmux
像这样:
tmux new-session -d -n minecraft /var/minecraft/bin/server_nogui.sh
然后向 Minecraft 服务器发送停止命令,如下所示:
tmux send-keys -t minecraft "stop^M"
请注意,上面的 ^M 序列是真实输入的视觉表示。您可以在命令上生成它,例如点击Ctrl+ v Enter。这比使用 echo 语句发送回车更容易瓦格的回答。