我正在尝试在我的 unRAID 服务器上运行 minecraft 服务器。
服务器将在 shell 中运行,然后坐在那里等待输入。要停止它,我需要输入“停止”并按回车键,然后它会拯救世界并优雅地退出,然后我又回到了 shell 中。如果我通过 telnet 进入 NAS 盒子运行它,这一切都有效,但我想直接在盒子上运行它。
这是我之前的第一次尝试:
#define USER_SCRIPT_LABEL Start Minecraft server
#define USER_SCRIPT_DESCR Start minecraft server. needs sde2 mounted first
cd /mnt/disk/sde2/MCunraid
screen -d -m -S minecraft /usr/lib/java/bin/java -Xincgc -Xmx1024M -jar CraftBukkit.jar
Run Code Online (Sandbox Code Playgroud)
MCunraid 是我拥有 Craftbukkit.jar 和所有世界文件等的文件夹。如果我直接输入该屏幕行,屏幕会设置分离并启动服务器。如果我从脚本中执行该行,它似乎没有设置屏幕
要停止服务器,我需要在 STOP 中“键入”,然后按 Enter。我的方法是
screen -S minecraft -X stuff "stop $(echo -ne '\r')"
Run Code Online (Sandbox Code Playgroud)
将文本停止和回车发送到屏幕“我的世界”。但这不起作用,即使我直接在命令行上输入它。但是如果我'screen -r'我可以在服务器运行的情况下进入屏幕,然后输入'stop'并正确关闭。
如果我 telnet 进入并手动执行,服务器运行良好,只需要运行它而无需从我的远程计算机连接。
Gil*_*il' 51
我至少可以解决部分问题:为什么该stop部分不起作用。实验上,当您以分离模式 ( screen -d -m)启动 Screen 会话时,不会选择任何窗口,因此稍后发送的输入将screen -X stuff丢失。您需要明确指定要将按键发送到窗口 0 ( -p 0)。无论如何,这是一个好主意,以防您因任何原因碰巧在该 Screen 会话中创建其他窗口。
screen -S minecraft -p 0 -X stuff "stop^M"
Run Code Online (Sandbox Code Playgroud)
(屏幕转换^M为 control-M,这是Enter按键发送的字符。)
从脚本启动会话的问题可能与 unMENU 有关。
Cal*_*leb 29
请注意,该$()构造从命令的输出中去除换行符,以便输出行可以用作其他程序的参数。这可能会导致意外行为。在这种情况下,我假设您专门尝试发送等效的Enter击键。虽然您发送的回车\r不会被分割,但有几种更简单的方法可以输入该字符而无需额外的命令。
您可以在双引号内放置一个常规换行符
screen -S minecraft -X stuff "stop
"
Run Code Online (Sandbox Code Playgroud)或者您可以使用Ctrl+v Enter序列在终端行中输入字符。这看起来像^M在终端中,但它是一个特殊的换行符。
screen -S minecraft -X stuff "stop^M"
Run Code Online (Sandbox Code Playgroud)Screen 在接受从未附加的 screen 会话的输入方面存在问题。如果您运行它,它将失败:
screen -d -m -S minecraft zsh
screen -S minecraft -X stuff "stop^M"
screen -r minecraft
Run Code Online (Sandbox Code Playgroud)
但是,如果您运行它,它将起作用:
screen -d -m -S minecraft zsh
screen -r minecraft (then disconnect with Ctrl-a-d)
screen -S minecraft -X stuff "stop^M"
screen -r minecraft
Run Code Online (Sandbox Code Playgroud)
tmux的screen.GNU-Screen 多年来一直是事实上的终端多路复用器,但它早已停止开发,错误和怪癖也没有得到修复。Tmux 正在积极开发中,包括许多屏幕无法触摸的功能,并且其开箱即用的行为更加直观。此外,它更好地记录在案。以下是转换代码的方法:
# Start new detached tmux session with a named window pane running the java app
tmux new-session -d -n minecraft /usr/lib/java/bin/java [args]
# Send it keys to stop the mincraft server
tmux send-keys -t minecraft "stop^M"
Run Code Online (Sandbox Code Playgroud)
小智 8
我为挖掘这篇旧帖子而道歉,但如果在我遇到类似问题时可以获得这些信息,这将对我的努力有所帮助。关于如何在 bash 脚本中发送屏幕命令有很多问题。与猫剥皮一样,这可能会完成,但我喜欢这种方式。有了这个,您只需调用 say_this 函数即可发送任何命令或说出任何内容。
#!/bin/bash
say_this()
{
screen -S minecraft -p 0 -X stuff "$1^M"
}
say_this "say Saving world"
say_this "save-off"
say_this "save-all"
...
Run Code Online (Sandbox Code Playgroud)
这是用ssh!
#!/bin/bash
say_this()
{
# Dont forget to set NAME or whatever
ssh -p 8989 192.168.1.101 screen -S $NAME -p 0 -X stuff \"$1^M\"
}
say_this "say test"
say_this "say !@#$%^&*()<>?This string will work!"
Run Code Online (Sandbox Code Playgroud)