web-dev-qa-db-ja.com

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

私の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を使用して手動で実行すると、サーバーは正常に動作します。リモートコンピューターから接続せずに実行するだけです。

47
richard plumb

問題の少なくとも一部を解決できます。なぜ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で送信するキャリッジリターンはストライプ化されませんが、追加のコマンドを必要とせずにその文字を入力する簡単な方法がいくつかあります。

  1. 二重引用符の中に通常の改行を入れることができます

    screen -S minecraft -X stuff "stop
    "
    
  2. または、次を使用して端末行に文字を入力できます。 Ctrl+vEnter シーケンス。これはターミナルでは^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は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"
25
Caleb

この古い投稿をご紹介いただきましたことをお詫び申し上げますが、同様の問題が発生した時点でこの情報が利用可能であった場合、これは私の努力に役立ちました。 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!"
5
fuzzyfreak