Проблема с неблокирующим fifo в bash - PullRequest
0 голосов
/ 29 июня 2009

Я использую несколько серверов 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 без блокировки, И все мои клавиатурные данные на самом сервере должны быть отправлены на сервер, И все выходные данные сервера должны быть записаны на консоль.

Возможно ли это? Если да, то как?

1 Ответ

1 голос
/ 29 июня 2009

Я понимаю, что это не тот ответ, который вы преследовали, но вы, вероятно, можете сделать это с помощью Gnu Screen .

Screen - это программа, которая создает псевдо-TTY. Вы можете использовать эту возможность, чтобы позволить вам поделиться сеанс экрана. Таким образом, вы можете войти на сервер внутри экрана, и ваш скрипт сможет поделиться этим сеансом, отправить команду, которую вы видите, и затем прекратить совместное использование. Процесс для настройки экрана, разрешающий совместное использование сеансов, описан здесь . Для этого требуется root-доступ, но я предполагаю, что он у вас есть, если вы используете сервер TF2.

После того, как вы настроили процесс setuid и у вас на экране появилось приглашение сервера, вы можете войти в свой скрипт в соответствующее поле, подключиться к экрану, отправить нужную команду на сервер, отправить Ctrl-A, d отключиться от экрана, а затем выйти из системы.

...