我正在尝试在我的 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 进入并手动执行,服务器运行良好,只需要运行它而无需从我的远程计算机连接。
我有一个screen正在运行的实例,我需要在 中执行一些代码screen,然后将结果输出到我的脚本中。
第一部分很简单,我只是screen -S session_name -X eval 'stuff "$cmd"\015'。
(我修改了我在脚本中找到的一行)
第二部分,获取输出,比较棘手。无论大小如何,我怎样才能获得整个输出?
在我正在构建的脚本中,我正在试验如何尽可能地自动化。更有趣的挑战之一是连接到 byobu 屏幕会话并执行命令。
所以我从明显的地方开始,查看有多少屏幕会话(游戏在 byobu 中有 3 个窗口,而 lordquackstar 有 2 个。用户在不同的腻子实例中)
game@quackgame:~$ screen -ls
There is a screen on:
2019.byobu (01/05/2011 05:10:04 PM) (Attached)
1 Socket in /var/run/screen/S-game.
Run Code Online (Sandbox Code Playgroud)
只有一个,所以我检查了系统
lordquackstar@quackgame:/home/game$ sudo ls -lAR /var/run/screen/
/var/run/screen/:
total 0
drwx------ 2 game users 100 2011-01-06 09:18 S-game
drwx------ 2 lordquackstar lordquackstar 100 2011-01-06 09:17 S-lordquackstar
/var/run/screen/S-game:
total 4
prwx------ 1 game users 0 2011-01-08 07:55 2019.byobu
-rw------- 1 game users 0 2011-01-06 09:18 byobu-exchange
-rw-r--r-- 1 game users 3 2011-01-08 07:32 …Run Code Online (Sandbox Code Playgroud)