Я использую несколько серверов 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' в канал (который должен завершить работу сервера) и запускаю его на экране, экранное окно по какой-то причине становится убитым (почему?)
Мне нужен только сервер для чтения fifo без блокировки, И все мои клавиатурные данные на самом сервере должны быть отправлены на сервер, И все выходные данные сервера должны быть записаны на консоль.
Возможно ли это? Если да, то как?