bash中非阻塞fifo的问题

时间:2009-06-29 11:37:24

标签: bash readonly pipe nonblocking fifo

我正在运行一些Team Fortress 2服务器,我想编写一些管理脚本。

基本上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并且服务器本身的所有键盘输入都应该发送到服务器并且应该将所有服务器输出写入控制台。

这可能吗?如果是,怎么做?

1 个答案:

答案 0 :(得分:1)

我意识到这不是你所追求的同样的答案,但你可以这样做using Gnu Screen

Screen是一个制作伪TTY的程序。您可以使用它的功能让您共享屏幕会话。这样,您就可以登录到屏幕内的服务器,并且您的脚本可以共享该会话,发送您可以看到的命令,然后停止共享。 process to get screen set up to allow sharing sessions is described here。{{3}}。它需要root访问权限,但是如果你正在运行TF2服务器,我假设你有。

设置完setuid进程并在屏幕内显示服务器提示后,您可以让脚本登录到相关的框,连接到屏幕,将所需命令发送到服务器,发送Ctrl-A,d断开与屏幕的连接,然后注销。