0

私はいくつかのTeamFortress2サーバーを実行していて、小さな管理スクリプトを書きたいと思っています。

基本的に、TF2サーバーはサーバーコンソールを提供するfgプロセスであるため、サーバーを起動し、ステータスを入力して、サーバーから回答を得ることができます。

***@purple:~/tf2$ ./start_server_testing 
Auto detecting CPU
Using AMD Optimised binary.
Server will auto-restart if there is a crash.

Console initialized.
[bla bla bla]
Connection to Steam servers successful.
   VAC secure mode is activated.

status

hostname: Team Fortress
version : 1.0.6.1/15 3883 secure
udp/ip  :  ***.***.133.31:27600
map     : ctf_2fort at: 0 x, 0 y, 0 z
players : 0 (2 max)

# userid name uniqueid connected ping loss state adr

これで、コマンドsm_reloadadminsをすべてのサーバーに送信するスクリプトを作成したいと思います。これを行うために私が見つけた最良の方法は、パイプという名前のFIFOを使用することです。今私がやりたいのは、このパイプを読み取り専用にし、サーバープロセスをブロックしないようにすることです。これにより、パイプに書き込み、サーバーがそれを実行できますが、それでもサーバーの1つをコンソール経由で書き込みたいので、サーバーのfgプロセスとステータスを入力して回答を印刷します。

私はこれを試しました(serverfifoがmkfifo serverfifoであると仮定します):

./start_server_testing < serverfifo

動作していない場合、パイプに何かが書き込まれるまでサーバーは起動しません。

./start_server_testing <> serverfifo

これは実際にはかなりうまく機能しています。サーバーのコンソール出力を確認でき、FIFOに書き込むことができ、サーバーはコマンドを実行しますが、コンソールを介してサーバーに書き込むことはできなくなります。また、パイプ(サーバーを終了する必要があります)に「exit」と記述し、それを画面で実行している場合、何らかの理由で画面ウィンドウが強制終了されます(wtfはなぜですか?)。

サーバーがブロックせずにFIFOを読み取る必要があるだけで、サーバー自体のすべてのキーボード入力をサーバーに送信し、すべてのサーバー出力をコンソールに書き込む必要があります。

それは可能ですか?はいの場合、どのように?

4

1 に答える 1

1

これはあなたが追求していたのと同じ答えではないことはわかっていますが、おそらくGnu Screen を使用してこれを行うことができます。

Screen は疑似 TTY を作成するプログラムです。その機能を使用して、画面セッションを共有できます。このようにして、画面内のサーバーにログインでき、スクリプトはそのセッションを共有し、表示できるコマンドを送信してから共有を停止できます。セッションを共有できるように画面を設定するプロセスについては、こちらで説明しています。ルート アクセスが必要ですが、TF2 サーバーを実行している場合はアクセスできると思います。

setuid プロセスをセットアップし、画面内でサーバー プロンプトを表示したら、スクリプトを関連するボックスにログインさせ、画面に接続し、目的のコマンドをサーバーに送信し、Ctrl-A,d を送信して接続を切断できます。ログアウトします。

于 2009-06-29T12:08:24.457 に答える