
Linuxサーバーのマイ画面にMinecraftサーバーが接続されています。私はPythonを使用してScreen Stuffを介してMinecraftサーバーにデータをプッシュしています。画面の内容に文字が多すぎると、データが画面にプッシュされない傾向があることがわかりました。
たとえば、以下は正常に機能します。 Minecraft画面にテキストをプッシュします。
screen -r Minecraft -p0 -X stuff 'Some random text etc etc, contents are not relevant ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------^M'
100文字を追加すると、コンテンツを送信できなくなり、私が知っているエラーメッセージは生成されません。
screen -r Minecraft -p0 -X stuff 'Some random text etc etc, contents are not relevant-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------^M'
これは、screen stuffコマンドに文字制限があることを示すようです。もしそうなら、より多くの文字を可能にする代替案はありますか?私は時々私が観察した700-800文字の制限を超える非常に長いコマンドを画面にプッシュします。たぶん、テキストをファイルに入れて画面に渡すのは何とかうまくいくでしょうか?
答え1
まあ、マニュアルページではstuff
大きな入力には使えないと言われています。
stuff [string]
現在のウィンドウの入力バッファを文字列で埋めます。これは「貼り付け」コマンドと似ていますが、オーバーヘッドがはるかに少なくなります。 [...]"stuff"コマンドを使用して大きなバッファを貼り付けることはできません。キーバインディングに最も便利です。
ただし、これは次のことを意味しますpaste
。
paste [registers [dest_reg]]
指定されたレジスタの(接続された)内容を現在のウィンドウの標準入力キューに書き込みます。 「.」を登録すると、貼り付けバッファと見なされます。
readbuf [-e encoding] [filename]
指定されたファイルの内容を貼り付けバッファに読み込みます。 [...]
screen
私はマニュアルページ(2600行、166kB)をエディタに貼り付けてこれを試しました。
screen -S test -X readbuf /tmp/screen.txt
screen -S test -X paste .
保存した後、同じファイルをインポートするので、うまく機能するようですpaste
。ただし、これには複数のコマンドが必要であるという欠点があり、ファイルを介してデータを渡さずにこれを実行できるかどうかはわかりません。
とにかく、画面を介してデータを貼り付けるのが実行中のサーバーにコマンドを送信する最善の方法かどうかはわかりませんが、Minecraftがstdin以外にコマンドを送信する別の方法を提供するかどうかはわかりません。
ゲームサーバーで見た別の解決策は、入力をパイプからサーバーにリダイレクトすることです。
tail -f inputfile | ./whateverserver ...
その後、コマンドを実行する必要がある場合を実行してくださいecho some command >> inputfile
。これは入力の入力と似ている必要がありますscreen
。
単一入力に対するコマンドを自動補完するこのようなソリューションには、注意しないと同時に送信された複数のコマンドが混乱する可能性があるという問題があります。実際、これには閉鎖が必要です。
答え2
解決策が見つかりました。文字数制限内でコマンドを送信するだけで動作するようです。これはPythonでの設定です。
def runServerCode(code):
while len(code) > 600:
os.system("screen -r Minecraft -p0 -X stuff '" + code[:600] + "'")
code = code[600:]
code += "^M"
os.system("screen -r Minecraft -p0 -X stuff '" + code + "'")
私が持っている唯一の問題は、コードが完了する前に他の情報が画面に送信され、プッシュされたコードが途中で分割されて正しく機能しないことがあることです。