2009-06-29 2 views
0

Я запускаю несколько серверов Team Fortress 2, и я хочу написать небольшой скрипт управления.Проблема с неблокированием fifo в bash

В основном сервера TF2 это процесс фга, который предоставляет консоль сервера, так что я могу запустить сервер, состояние типа и получить ответ от него:

***@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 named pipe. Теперь я хочу, чтобы этот канал был только для чтения и не блокировал серверный процесс, поэтому я могу писать в трубу, и сервер выполняет его, но все же я хочу написать через консоль один сервер, поэтому, если я вернусь обратно к процессу fg сервера и статусу типа I Я хочу, чтобы был напечатан ответ.

Я попытался это (при условии, 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

+0

Я удалил ваше последнее дополнение, просто потому, что это был не ответ. Мне жаль, что вы не чувствуете, что сайт вам помог, но (ваш комментарий). Я не вижу никаких доказательств того, что кто-то становится «злым», кроме вас самих, - просто тот, кто дал вам свою идею, которая не подходила что вы хотели ... –

ответ

1

Я понимаю, что это не ответ в том же духе, что и вы, но вы можете сделать это using Gnu Screen.

Экран - это программа, которая создает псевдотематику. Вы можете использовать его возможность разрешить общий сеанс экрана. Таким образом, вы можете войти на сервер внутри экрана, и ваш сценарий может поделиться этим сеансом, отправить команду, которую вы можете увидеть, а затем прекратить совместное использование. process to get screen set up to allow sharing sessions is described here. Он требует доступа root, но я предполагаю, что у вас это есть, если вы используете TF2-сервер.

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

+0

Я фактически использую экран, на котором я запускаю все свои серверы (CTRL + A, c созданные окна на одном экране). Я также написал это: '[...], и я запускаю его на экране, по какой-то причине окно экрана убивается (wtf почему?). [...]' Но теперь могу ли я написать возможно, экран?Я знаю, если я создам новый экран, я могу как-то отправить команду, которая выполняется на экране, а затем отсоединить, но могу ли я отправить команду на существующий экран? – timdel

+0

Нет, подождите, я думаю, что использование трубы для отправки текста в процесс по-прежнему лучше, чем отправка его на экран. – timdel

+0

Ах. Я не понял, что вы говорите в этом параграфе. Тот факт, что вы используете экран, уже упрощает дело. В ответ на ваш вопрос «могу ли я отправить команду на существующий экран?», Мой ответ объяснял, как именно вы будете заниматься этим процессом. Где я был неясен? –

Смежные вопросы