Debian 9 の Bash Shell スクリプトと通信する NodeJs バックエンドサーバーを使用して Minecraft Web インターフェイスを構築したいと思います。
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バックエンドから読み取る方法です。
私のNodeJバックエンド:https://hastebin.com/adosiwiqiq.coffeescript
私のシェルスクリプト:https://hastebin.com/acijegupud.bash
答え1
私はこれがうまくいくと思いますscreen
。fifo は画面にコマンド出力を取得します。しかし、「minecraftシェル」がこれをサポートするかどうか疑問です。
しかし、これは「実行可能」ですtmux
。
プロセス状態/スタックトレース
スタックトレース
これが正しく機能するためには、コマンドを提供するプログラムが関連するIO操作で停止している点を検出する必要があります。 1つの方法は、スタックトレースを実行して検索することです。また見なさい:コマンドが実行されているのか、それともユーザー入力を待っているのか、どうすればわかりますか?。
read
必要になる前に一時的に別の場所にかかる可能性があるため、少し面倒です。また、かかった時間とファイル記述子に基づいて少し推測する必要があるかもしれません。精度をさらに高めるために、以下の行計算提案と組み合わせることができます。
編集するread(10,
これをテストしながら(zsh
)とselect(1, [0], NULL, NULL, NULL
(cliインタプリタ)に会いましたpython3
。おそらく他の可能性はほとんどありません。これがまさにRegEx
以下のスクリプトでこれに限定されない理由です。今は左括弧だけを探しています。
たぶん誰かがこれを行うより正確な方法を知っていますか?
プロセス状態
良い指標は、プロセスが実行中かスリープモードであるかを確認することです。を使用してこれを行うことができますps
。この方法は、以下の概念証明スクリプトのスタックトレースとともに使用されます。
計算ライン
サーバーをChild Process
Nodeからプロセスとして実行すると、stdin
Nodestdout
のプロセスと対話できます。改行( )だけを参照でき\n
、出力する必要がある行数を知っていれば、これを数えて実行が完了し、再び入力を待っていることを「知る」ことができます。これをタイムアウトと組み合わせることができます。
プロセス状態/Straceを使用した概念証明
スクリプトといくつかの文書を次に移動しました。githubリポジトリ。私はこれをまだmcでテストしていませんが、python3
andで動作しますzsh
(テストできる限り「テスト」セクションを参照してください)。それでも、少しの待ち時間が必要で、誤検出が発生したり発生しない可能性があるため、まだ完璧ではありません。
使い方
tmux
次のようにサーバー/セッションを開始できます。
tmux new-session -d -s server_name "java -jar minecraft_server.jar"
サーバーにコマンドを送信すると、次のようになります。
./trun.sh -s server_name -c "the command"
サーバーの出力を返す必要があります。パラメータ-H
を調整する必要があるかもしれません-T
。
並行性
ネットワークサーバーでこのプログラムを実行すると、特にユーザーが複数人の場合に問題が発生する可能性があります。実装する必要があるかもしれません。ロックする複数のユーザーが同時にシェルにアクセスするのを防ぎます。それ自体は問題にならないと確信していますtmux
が、その出力を読み込もうとしている間に他のコマンドを実行できる場合は、実際に出力を予測することはできません。
安全
wwwに公開されているサーバーでこのプログラムを実行する予定の場合は、それを保護することを検討してください(apache
パスワードで保護されたプロキシを介して使用するなどnginx
)。