私のunRAIDサーバーでminecraftサーバーを実行しようとしています。
サーバーはシェルで実行され、そこに入力を待機します。停止するには、「stop」と入力してEnterキーを押す必要があります。そうすると、世界が保存されて正常に終了し、シェルに戻ります。 NASボックスにtelnet接続することで実行すると、すべて機能しますが、ボックスで直接実行したいと思います。
これは私が最初に試みたものです:
#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」と入力すると、適切にシャットダウンします。
Telnetを使用して手動で実行すると、サーバーは正常に動作します。リモートコンピューターから接続せずに実行するだけです。
問題の少なくとも一部を解決できます。なぜ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に関連しています。
$()
構文がコマンドの出力から改行を取り除いて、出力行を他のプログラムの引数として使用できるようにするだけです。これにより、予期しない動作が発生する可能性があります。この場合、私はあなたが特に同等のものを送ろうとしていると思います Enter キーストローク。 \r
で送信するキャリッジリターンはストライプ化されませんが、追加のコマンドを必要とせずにその文字を入力する簡単な方法がいくつかあります。
二重引用符の中に通常の改行を入れることができます
screen -S minecraft -X stuff "stop
"
または、次を使用して端末行に文字を入力できます。 Ctrl+vEnter シーケンス。これはターミナルでは^M
のようになりますが、特別な改行文字です。
screen -S minecraft -X stuff "stop^M"
スクリーンには、アタッチされていないスクリーンセッションへの入力の受け入れに関する問題があります。これを実行すると失敗します。
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はde-facto端末マルチプレクサーとして長年使用されてきましたが、開発が中止され、バグや癖が修正されていません。 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"
この古い投稿をご紹介いただきましたことをお詫び申し上げますが、同様の問題が発生した時点でこの情報が利用可能であった場合、これは私の努力に役立ちました。 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!"