Dmitry Lyzin <Dmitry_Lyzin@p2.f1613.n5020.z2.fidonet.org> wrote:
DL> Hello All,
DL> Решил я у себя Quake-сервер все время держать запущенным, да вот проблема
-
DL> много процессорного времени он жрет. Тогда я придумал - запускать
Quake-сервер с
DL> низким приоритетом и написать скрипт который смотрит, что Quake-сервер на
DL> стандартный выход выдает, отлавливает момент когда в него игруны полезли и
DL> повышает его приоритет и, соответствено, когда из него все игруны повылезли
-
DL> понижает его приоритет обратно.
DL> Hе получилось... Quake, вонючка, когда его стандартный вывод на что-нибудь
DL> кроме /dev/tty* направляешь (ну, в файл, через конвеер в другую прогу,
итд),
DL> ничего туда писать не хочет! Как бы его все таки обмануть?
Так на то expect есть.
#!/usr/bin/expect
spawn quake-server
exec renice -20 -p -p [exp_pid]
while {1} {
expect {
"player connected" {
exec renice +20 -p [exp_pid]
}
"no more players" {
exec renice -20 -p [exp_pid]
}
eof {
# Сервер упал
spawn quake-server
exec renice -20 -p [exp_pid]
}
}
Внимание - имена программ и сообщения, написаны от фонаря. quake server
я в глаза не видел и видеть не хочу.
DL> Тут появилась другая идея - Quake-сервер с помощью inetd запускать! Я все,
DL> вроде, правильно настроил. И - нифига! Hе может inetd Quake запустить! Он
его
DL> запускает, запускает,... а он не запускается! Как-же Quake правильно в
DL> inetd.conf правильно вписать?
Полагаю, что никак. Quake хочет с сокетами напрямую работать, а inetd .
запускает сервер, передавая ему открытый сокет как stdin/stdout
DL> Тут появилась совсем крутая идея, правда, с учетом предистории, совсем
DL> непонятно, как ее осуществить.
DL> Итак, Quake-сервер постоянно находиться в загруженном, но остановленном
DL> состаянии. В смысле, не дают ему процессор вообще! Чтоб процессорное время
не
DL> жрал. Кстати, как это сделять?
kill -STOP `pidof quake-server`
DL> Когда к Quake-серверу кто-нибудь обращается, inetd запускает скриптик или
DL> выполняет какую-то (какую?) команду, которая разрешает Quake-серверу
kill -CONT `pidof quakeserver`
DL> выполняться. Другой скрипт следит за выводом Quake-сервера, отлавливает
момент
Только вот это ничему не поможет, поелику игрок будет приконнекчен к
inetd а не к quakeserver. Разве что оный скрипт будет сам коннектиться к
серверу и свой stdin/stdout ему форвардить.
DL> когда из него все игруны повылазили и отбирает у него процессор.
Если идти таким путем, то у каждого юзера будет свой экземляр, скажем так,
quake-proxy. И считать юзеров проще всего посредством семафора.
Каждая копия при входе смотрит на этот семафор. Если он 0, она его
взводит в 1 и шлет SIGCONT. Если не ноль, то просто увеличивает.
При выходе она его уменьшает, и если он стал 0, шлет SIGSTOP.
Только, вот с expect явно проще.
-- -------------------------------------------------------- I have tin news and pine mail... Victor Wagner @ home = vitus@wagner.rinet.ru -- end of forwarded message --
-- С тем, что не помешает никогда, Kittle