进程状态/堆栈跟踪

进程状态/堆栈跟踪

我想使用 NodeJs 后端服务器构建 Minecraft Web 界面,该服务器与 Debian 9 上的 Bash Shell 脚本进行通信。

1:我使用以下命令创建一个新的 Minecraft 服务器screen -S server_name java -jar minecraft_server.jar

2:NodeJs 后端向我的 Shell 文件发送一个命令,效果很好:例如screen -rd server_name -X stuff "whitelist add $3^M"

3:服务器屏幕上将显示一个包含玩家列表的字符串。

但我的问题是,如何读取这个输出字符串并让 NodeJs 后端读取它?

我的 NodeJs 后端:https://hastebin.com/adosiwiqiq.coffeescript

我的外壳脚本:https://hastebin.com/acijegupud.bash

答案1

我认为这在screen.您可以使用fifo 在屏幕上获取命令的输出,但我怀疑“minecraft shell”是否会支持这一点。

然而,这是“可行的” tmux

进程状态/堆栈跟踪

堆栈跟踪

为了使其正常工作,您必须检测您正在提供命令的程序在哪个点卡在相关的 IO 操作上。一种方法是运行堆栈跟踪并寻找它。另请参阅:如何判断命令是否正在运行或正在等待用户输入?

这可能有点棘手,因为它可能会在read所需的之前暂时卡在另一个位置。它还可能需要根据卡住的时间和文件描述符进行一些猜测。它可以与下面的行计数建议结合起来以获得更高的准确性。

编辑 在测试这个时,我遇到了read(10,zsh)和select(1, [0], NULL, NULL, NULLpython3cli 解释器)。可能还有很少的其他可能性,这就是为什么我没有将RegEx下面的脚本中的限制仅限于此。它现在只是在寻找一个左括号。 也许有人知道更精确的方法来做到这一点?

进程状态 一个好的指标可能是检查进程是否正在运行或睡眠。您可以使用 来执行此操作ps。此方法与堆栈跟踪结合用在下面的概念验证脚本中。

计数线

让服务器作为Child ProcessNode 中的进程运行使您能够与stdinNodestdout中的进程进行交互。您可以只查找换行符 ( \n),如果您知道输出应该有多少行,您可以对它们进行计数并“知道”它已完成运行并正在再次等待输入。您可以将其与超时结合起来。


使用进程状态/Strace 进行概念验证

我将脚本和一些文档移至github 存储库。我还没有使用 mc 对此进行测试,但它可以与python3and一起使用zsh(据我可以测试它,请参阅“测试”部分)。它仍然不完美,因为它仍然需要一些等待,并且可能会也可能不会得到误报。

如何使用

tmux您可以像这样启动服务器/会话:

tmux new-session -d -s server_name "java -jar minecraft_server.jar"

向服务器发送命令如下所示:

./trun.sh -s server_name -c "the command"

它应该返回服务器的输出。您可能需要调整-H-T参数。


同步性

请注意,如果您在网络服务器上运行此程序,则可能会遇到问题,尤其是在有多个用户的情况下。您可能必须实施防止多个用户同时访问 shell。我确信它tmux本身不会有问题,但是如果在您尝试读取所述输出时可能运行了另一个命令,您就无法真正预测输出。

安全

如果您打算在暴露于 www 的服务器上运行此程序,请考虑保护它(例如通过apache或使用受密码保护的代理nginx)。

相关内容