it-swarm.cn

将文本输入发送到分离的屏幕

我试图在我的unRAID服务器上运行minecraft服务器。

服务器将在命令行管理程序中运行,然后坐在那里等待输入。要停止它,我需要输入“ stop”并按Enter,然后它将保存世界并正常退出,我回到了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

MCunraid是存放Craftbukkit.jar和所有世界文件等的文件夹。如果我直接输入该屏幕行,则该屏幕会分离安装程序并启动服务器。如果我从脚本中执行该行,则似乎没有设置屏幕

要停止服务器,我需要在STOP中“键入”,然后按Enter。我的方法是

screen -S minecraft -X stuff "stop $(echo -ne '\r')"

向屏幕“ minecraft”发送短信s-t-o-p和回车。但这不起作用,即使我直接在命令行上输入也是如此。但是,如果我使用“ screen -r”,则可以在服务器运行的情况下进入屏幕,然后键入“ stop”,它将正常关闭。

如果我远程登录并手动执行服务器,则服务器运行良好,只需要运行它即可,而无需与远程计算机连接。

47
richard plumb

我至少可以解决部分问题:为什么stop部分不起作用。实验上,当您以分离模式(screen -d -m)启动Screen会话时,没有选择任何窗口,因此稍后以screen -X stuff发送的输入将丢失。您需要明确指定要将击键发送到窗口0(-p 0)。无论如何,这都是一个好主意,以防万一您出于某种原因在那个Screen会话中创建其他窗口。

screen -S minecraft -p 0 -X stuff "stop^M"

(将^M屏幕翻译为control-M,这是由 Enter 键。)

从脚本启动会话的问题可能与unMENU有关。

43

首先,关于轻松输入换行符的注意事项:

请注意,$()构造从命令输出中删除换行符,以便将输出行用作其他程序的参数。这可能会导致意外的行为。在这种情况下,我假设您专门尝试发送与 Enter 击键。在回车时,您使用\r不会被剥夺,有几种简单的方法可以输入该字符,而无需使用额外的命令。

  1. 您可以在双引号中放置常规换行符

    screen -S minecraft -X stuff "stop
    "
    
  2. 或者,您可以使用 Ctrl+vEnter 序列。看起来像^M在终端中,但这是一个特殊的换行符。

    screen -S minecraft -X stuff "stop^M"
    

其次,关于屏幕行为不稳定的说明。 ( Gilles的解释和解决方案

屏幕在接受从未附加的屏幕会话的输入方面存在问题。如果运行此命令,它将失败:

screen -d -m -S minecraft zsh
screen -S minecraft -X stuff "stop^M"
screen -r minecraft

但是,如果运行此命令,它将起作用:

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

最后,您可以使用表现更好的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"
25
Caleb

我为挖掘这个旧帖子深表歉意,但是如果我在遇到类似问题时能够获得此信息,这将对我的工作有所帮助。关于如何在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"
...

这是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 [email protected]#$%^&*()<>?This string will work!"
5
fuzzyfreak