2009-06-29 12 views
0

私はいくつかのTeam Fortress 2サーバを稼働させており、少し管理スクリプトを書いています。bashの非ブロック化FIFOに関する問題

基本的には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という名前のパイプを使用することです。 ここで私がしたいのは、このパイプを読み取り専用にしてサーバープロセスにブロックしないようにすることです。パイプに書き込むことができ、サーバーはそれを実行しますが、コンソールを介してサーバーに書き込むため、サーバーのfgプロセスに入力し、ステータスを入力して回答を出力します。

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

./start_server_testing < serverfifo 

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

./start_server_testing <> serverfifo 

ザッツは実際にはかなり良い働いて、私は、サーバーのコンソール出力を見ることができると私は、FIFOに書き込むことができますし、サーバーがコマンドを実行するが、私はもう、サーバーへのコンソール経由で書き込むことはできません。また、パイプ(サーバーを終了する必要があります)に 'exit'と書いて、スクリーンのウィンドウを何らかの理由で強制終了させて​​しまっています(なぜ?)。

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

これは可能ですか?はいの場合、どうですか?

+0

"./start_server_testing <> serverfifo"を使用していると仮定しています。stdioをserverfifoに再マップして、キーボードをstdioとして失います。 2つのソースをプロセスのstdioにマップすることは可能ですか(私の場合はキーボードとサーバフィジオになります) – timdel

+0

最近の追加を削除しました。あなたのサイトがあなたを助けたとは思わないと申し訳ありませんが、(あなたのコメントを)私は自分以外の誰も "怒っている"という証拠を見ることはできません。あなたが望んでいたもの... –

答えて

1

私はこれがあなたが追求していたのと同じ静脈での答えではないことを認識していますが、おそらくこれを行うことができますusing Gnu Screen

スクリーンは疑似TTYを作成するプログラムです。その機能を使用して、画面セッションを共有できます。これにより、画面内のサーバーにログインすることができ、スクリプトはそのセッションを共有したり、表示できるコマンドを送信したり、共有を停止することができます。 process to get screen set up to allow sharing sessions is described here。それはrootのアクセスが必要ですが、あなたがTF2サーバーを稼働しているなら、それを持っていると推測しています。

setuidプロセスが設定され、画面内にサーバープロンプトが表示されたら、該当するボックスにスクリプトをログインさせ、画面に接続して、サーバーに目的のコマンドを送信し、Ctrl- dを押して画面を切断し、ログアウトします。

+0

私は実際に私のすべてのサーバー(CTRL + A、C画面を1つの画面に作成)を実行する画面を使用しています。私はまたそれを書いた: '[...]と私は画面ウィンドウが何らかの理由で死ぬようになっている画面でそれを実行しています(なぜ?)。[...]' しかし今、私は書くことができます画面はおそらく?私は、新しい画面を作成すると、何とか画面で実行されたコマンドを送信して切り離すことができますが、既存の画面にコマンドを送ることはできますか? – timdel

+0

待たずに、私はパイプを使ってプロセスにテキストを送るのは、それを画面に送るよりも良い考えだと思います。 – timdel

+0

ああ。私はその段落であなたが何を言っているのか理解できませんでした。あなたがスクリーンを使っているという事実はすでに問題を簡単にしています。 「あなたは既存の画面にコマンドを送信できますか?」という質問に答えて、私の答えはそのプロセスについてどのように説明するのか正確に説明していました。どこがわかりませんか? –

関連する問題