2009-06-29 120 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从屏幕上断开连接,然后注销。