2009-06-29 44 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'並且我在屏幕上運行它,屏幕窗口因爲某種原因而被殺死(wtf爲什麼?)。

我只需要服務器在不阻塞的情況下讀取fifo,並將服務器本身的所有鍵盤輸入發送到服務器,並將所有服務器輸出寫入控制檯。

這可能嗎?如果是,如何?

+0

我假設通過使用「./start_server_testing <> serverfifo」我將stdio重新映射到serverfifo,因此它丟失了我的鍵盤作爲stdio。是否有可能將兩個源映射到一個進程的stdio(這將在我的情況下,鍵盤和serverfifo) – timdel 2009-06-29 13:07:55

+0

我刪除了最近的添加,只是因爲它不是一個答案。對不起,你不覺得這個網站對你有幫助,但是(重新發表你的評論)我看不到任何人除了你自己「生氣」之外的任何證據 - 只是給你提供他們想法的人,不適合你想要什麼...... – 2009-06-30 21:30:11

回答

1

我意識到這不是你追求的同一脈絡,但你可以做到這一點using Gnu Screen

屏幕是一個程序,使僞TTY。您可以使用它的功能讓您分享屏幕會話。這樣,您可以登錄到屏幕上的服務器,並且您的腳本可以共享該會話,發送您可以看到的命令,然後停止共享。該process to get screen set up to allow sharing sessions is described here。它需要root訪問權限,但如果您運行的是TF2服務器,我假設您擁有該權限。你可以讓你的腳本登錄到相應的盒子,連接到屏幕,發送所需的命令到服務器,發送Ctrl-A, d從屏幕上斷開連接,然後註銷。