私はいくつかの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を読み取る必要があるだけで、サーバー自体のすべてのキーボード入力をサーバーに送信し、すべてのサーバー出力をコンソールに書き込む必要があります。
それは可能ですか?はいの場合、どのように?