問題の少なくとも一部を解決できます:stop
の理由 部分が機能していません。実験的に、デタッチ モード (screen -d -m
) で Screen セッションを開始すると、 )、ウィンドウが選択されていないため、入力は後で screen -X stuff
で送信されます 失われるだけです。キーストロークをウィンドウ 0 (-p 0
)。なんらかの理由でその Screen セッションで別のウィンドウを作成した場合に備えて、これはとにかく良い考えです。
screen -S minecraft -p 0 -X stuff "stop^M"
(画面翻訳 ^M
Enter によって送信される文字である control-M に キー)
スクリプトからセッションを開始する際の問題は、unMENU に関連している可能性があります。
最初に、改行を簡単に入力するための注意:
$()
construct は command の出力から改行を取り除き、出力行を他のプログラムの引数として使用できるようにします。これにより、予期しない動作が発生する可能性があります。この場合、具体的に Enter に相当するものを送信しようとしていると仮定します キーストローク。 \r
で送信しているキャリッジ リターンの間 余分なコマンドを必要とせずにその文字を入力する簡単な方法がいくつかあります。
二重引用符の中に通常の改行を入れることができます
screen -S minecraft -X stuff "stop
"
または、Ctrl を使用してターミナル ラインに文字を入力することもできます +v 入る 順序。これは ^M
のようになります 端末では、これは特殊な改行文字です。
screen -S minecraft -X stuff "stop^M"
第二に、不規則な画面の動作に関するメモ。 (Gilles による説明と解決策)
Screen には、アタッチされたことのない screen セッションへの入力の受け入れに関する問題があります。これを実行すると失敗します:
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"
この古い投稿を掘り下げて申し訳ありませんが、同様の問題が発生したときにこの情報が入手できていれば、私の努力に役立ちました. 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 [email protected]#$%^&*()<>?This string will work!"