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


44

我正在尝试在我的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”发送文本停靠点和回车符。但这不起作用,即使我直接在命令行上输入也是如此。但是,如果我使用“ screen -r”,则可以在服务器运行的情况下进入屏幕,然后键入“ stop”,它将正常关闭。

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


这看起来不错。脚本的全部内容是什么,您如何运行它?它会产生任何输出吗?您如何得知screen启动失败?尝试set -x在脚本顶部(紧接在该#!行之后)添加,然后在运行脚本时报告跟踪输出。
吉尔(Gilles)'所以

那就是脚本的全部内容:)如果我直接键入它,screen命令会起作用,所以我认为我的主要问题是停止部分
Richardard plumb

您写道:“如果我从脚本中执行该行,则似乎没有设置屏幕”。那么开始部分是否起作用?如果没有,请参阅我的第一条评论。
吉尔(Gilles)“所以,别再邪恶了”,

我正在尝试将其作为unMENU用户脚本运行。如果我的用户脚本带有确切的屏幕命令,则不会发生任何事情。如果我在telnet窗口中输入screen命令,它将在屏幕中启动服务器,如您所愿。因此,我认为在处理unMENU用户脚本的方式上有一些我不了解的区别。
理查德·李布(Richard plumb)

现在我们到了某个地方。请使用有关您如何使用unMENU的信息来更新您的问题。并做尝试加入两行#!/bin/bash,并set -x在脚本的顶部,并显示我们从脚本输出的跟踪。您可能需要查看unMENU文档,以找到输出结果。
吉尔(Gilles)'所以

Answers:


40

我至少可以解决部分问题:为什么这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有关。


1
美观,功能出色(至少从命令行开始,以后会戳掉菜单菜单的家伙)。这似乎引发了很多人,这是我第一次看到具体的解决方案。我只是希望我能有足够的分数来投票支持您:D
理查德·梅布(Richard plumb)

该死的!即使屏幕已连接,它也可以正常工作,而无需重新连接!从系统中的其他应用程序向简单应用程序发送命令的一种好方法。谢谢!:)
Grzegorz Wierzowiecki 2011年

我从来没有遇到过这个问题,可能是因为我一直计划在屏幕会话中有几个(命名的)窗口,而且我总是按名称选择窗口。
Ekevoo 2014年

手册,以供参考:-X 将指定的命令发送到正在运行的屏幕会话。如果正在运行多个屏幕会话,则可以使用-S选项指定屏幕会话。您可以使用-d或-r选项告诉屏幕仅查找已连接或已分离的屏幕会话。请注意,如果会话受密码保护,则此命令不起作用。
KrisWebDev

3
这对我不起作用。我创建了一个屏幕,screen -d -m -S hi然后运行screen -S hi -p 0 -X stuff "cd <some_directory>^M",结果什么也没得到...它只是将“ cd <some_directory> ^ M”作为字符串发送,并且不将“ ^ M”解释为输入键...
Tanner Strunk

23

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

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

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

    screen -S minecraft -X stuff "stop
    "
    
  2. 或者,您可以使用Ctrl+ v Enter序列在终端行中输入字符。这看起来像^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"

如果使用屏幕-r手动切换,则可以看到该屏幕,并且根本没有输入任何文本。即使回车失败了,我也应该输入“ stop”。但是什么都没做
理查德·铅锤

如果我有一个脚本,其中一行包含screen -r,然后有screen -X东西“ stop ^ M”,则它确实停止了服务器,而且还抱怨“错误的未知选项r”
理查德·铅锤

我在这里通过创建屏幕会话进行了测试,然后使用上面的命令运行良好。您可以使用连接到屏幕会话screen -d -RR minecraft吗?
卡莱布

是的,这将我连接到屏幕。屏幕-r ..也会挂起,如果我尝试屏幕-S minecraft -X东西“ stop ^ M”,然后手动屏幕-r,则屏幕上有“停止”文本。
理查德·李布(Richard plumb)

为我工作。也许您有一些时髦的东西,.screenrc或者您使用该名称打开了许多不安全的屏幕会话,因此您将数据发送给错误的屏幕会话?screen -list
卡莱布

4

我为挖掘这个旧帖子深表歉意,但是如果我在遇到类似问题时能够获得此信息,这将对我的工作有所帮助。关于如何在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 !@#$%^&*()<>?This string will work!"

简洁
明了
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.