分離した画面にテキスト入力を送信する

分離した画面にテキスト入力を送信する

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」画面にSTOPおよびENTERテキストを送信します。ただし、コマンドラインに直接入力しても機能しません。ただし、「screen -r」を使用すると、サーバーが実行中の画面に移動し、「stop」と入力すると正しく終了します。

リモートでログインして手動で行うと、サーバーはうまくいきます。リモートコンピュータから接続せずに実行するだけです。

答え1

私は少なくとも問題の一部、つまりそのstop部分が機能しない理由を解決できます。実験的に、分離モード()でスクリーンセッションを開始するとウィンドウが選択されscreen -d -mず、後で送信された入力がscreen -X stuff失われます。キーストロークがウィンドウ0()に送信されることを明示的に指定する必要があります-p 0。それにもかかわらず、何らかの理由でそのスクリーンセッションで別のウィンドウを作成する場合に備えて良い考えです。

screen -S minecraft -p 0 -X stuff "stop^M"

(画面は^Mキーを押すと送信される文字であるcontrol-Mに変換されますEnter。)

スクリプトでセッションを開始するときに発生する問題は、unMENUに関連している可能性があります。

答え2

最初に改行文字を簡単に入力する方法に関する注意事項:

この$()構成は、コマンド出力から改行を削除して出力行を他のプログラムの引数として使用できることに注意してください。これは予期しない動作を引き起こす可能性があります。この場合、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"

答え3

古い記事を掘り下げて申し訳ありませんが、同様の問題が発生したときにこの情報を活用すると役に立ちます。 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!"

関連情報