我正在运行一些 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 进程,我输入 status 我想打印一个答案。
我试过这个(假设serverfifo是mkfifo serverfifo):
./start_server_testing < serverfifo
不工作,服务器不会启动,直到有东西被写入管道。
./start_server_testing <> serverfifo
这实际上工作得很好,我可以看到服务器的控制台输出,我可以写入 fifo 并且服务器执行命令,但我不能再通过控制台写入服务器了。此外,如果我将“退出”写入管道(应该结束服务器)并且我在屏幕上运行它,屏幕窗口会因某种原因被杀死(为什么?)。
我只需要服务器在不阻塞的情况下读取fifo,并且服务器本身上的所有键盘输入都应该发送到服务器,并且所有服务器输出都应该写入控制台。
那可能吗?如果是,如何?