为什么 screen 似乎对通过 -X 传递的命令没有执行任何操作?

为什么 screen 似乎对通过 -X 传递的命令没有执行任何操作?

我一直在尝试为 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 语句发送回车更容易瓦格的回答

相关内容