【发布时间】:2009-06-29 11:37:24
【问题描述】:
我正在运行一些军团要塞 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 进程,我输入 status 我想打印一个答案。
我试过这个(假设 serverfifo 是 mkfifo serverfifo):
./start_server_testing < serverfifo
不工作,服务器不会启动,直到有东西被写入管道。
./start_server_testing <> serverfifo
这实际上工作得很好,我可以看到服务器的控制台输出,我可以写入 fifo 并且服务器执行命令,但我不能再通过控制台写入服务器了。另外,如果我将“退出”写入管道(应该结束服务器)并且我在屏幕上运行它,屏幕窗口会因某种原因被杀死(为什么?)。
我只需要服务器在不阻塞的情况下读取 fifo,并且我在服务器本身上的所有键盘输入都应该发送到服务器,并且所有服务器输出都应该写入控制台。
这可能吗?如果可以,怎么做?
【问题讨论】:
-
我假设通过使用“./start_server_testing serverfifo”我将 stdio 重新映射到 serverfifo,因此它失去了我的键盘作为 stdio。是否可以将两个源映射到进程的 stdio(在我的情况下是键盘和 serverfifo)
-
我删除了您最近添加的内容,只是因为它不是答案。很抱歉,您认为该网站对您没有帮助,但是(重新发表评论)我看不到任何证据表明除了您自己之外任何人都“生气”了-只是有人给了您他们的想法,但不适合你想要什么...
标签: bash readonly pipe nonblocking fifo