Несколько серверов в одной папке (Windows)

Обсуждаем все, что относится к выделенным серверам *NIX (Unix, Linux) и Windows
Ответить
Сообщение
Автор
omgiafs
Сержант
Сержант
Сообщения: 52
Зарегистрирован: 29.09.2005
Контактная информация:

#1 Сообщение 14.01.2009, 13:36

Значит так. Те кто сюда зашел чтобы флудануть на тему "лол, надо на линухе", то дверь - там.
Остальные могут читать дальше.
Особо радоваться не советую, я тут по идее за помощью обращаюсь, а не решение пишу :)
Ситуация конкретная - винда без вариантов.

Захотел сотворить сие на винде (2003 х64 СП2 вроде). Какой сервак дали - такой дали, тут я не виноват.
Сервера ТФ2 на стимэму (это не суть важно, что на стимэму, не об этом сейчас речь).

Себе поставил условия.
1. Естественно чтоб в одной папке
2. Метамод + сорсмод, при этом разный набор сорсмод-плагинов для каждого сервера.
3. Запуск от пользователя с ограниченными правами (runas.exe) автоматически при старте сервера (ну или хотя бы при логоне учетной записи с правами админа)
4. Автоматический рестарт сервера после падения (watchdog)

Сразу скажу, что изначально хотел сделать все как можно проще. Но винда внесла свои коррективы.

Папку сделал, плагины в одном (для начала сойдет) экземпляре настроил. Первая задача - запустить под юзером с ограниченными правами.
Тут начались затыки. Юзер есть, права есть. Задача - сунуть в автозагрузку профиля батник с запуском сервера с ограниченными правами. НО. Команда runas создает новое окно, в нем просит указать пароль. Не беда, пароль на юзера можно автоматом указать либо на WSH-скрипте
WshShell = WScript.CreateObject("WScript.Shell") ;
//запускаем с правами другого пользователя
WshShell.Run("runas /user:GAMESERVER\\tf2user \"C:\\tf2server\\orangebox\\srcds.exe -game tf -console +map ctf_2fort\"");
WScript.Sleep(500);
WshShell.AppActivate("runas.exe");
//пароль
WshShell.SendKeys("PASSWORD");
WScript.Sleep(100);
WshShell.SendKeys("~");
либо командой echo, либо с использованием сторонней программы (sanur, steelrun, RunasSpc - с шифрованием).
А дальше веселее. Ну запустили, может даже заработает. А как это в цикл засунуть (рестарт после падения) ? Если пихать в цикл, который начинается с команды "start", то гемор продолжается, потому что она тоже создает новое окно! А тупо запускать нельзя (без /wait, который есть только у start), потому как накидает тебе серверов - закрывать не успеешь.
Понял, что можно разрулить это дело одним хорошим WSH-скриптом, только вот в программировании не силен, да и по сравнению с FireDaemon'ом, к которому и пришел в оконцовке, для незнающего человека оно как-то сложно. Но что можно разрулить - это однозначно. Если есть знатоки - прошу помощи, давайте этот топик сделаем для других людей!
Ладно, допустим с помощью FireDaemon'a проблему запуска-рестарта с ограничением прав мы решили.

Но тут всплывают баги плагинов. Поясняю как в идеале делается запуск 2-х серверов из одной папки.

Создаете копии файла srcds.exe и обзываете их srcds1.exe и srcds2.exe. Соответственно в папке аддонов создаете папки sourcemod1 и sourcemod2, так как пока "однопапочность" сорсмода толком не реализована. Можно конечно и в одной папке, но тогда надо мегаконфиг создавать, где список загружаемых плагинов рисовать и параметры, так как все БУДЕТ различаться, начиная с логов.
Пример1

srcds1.exe -heapsize 786432 -tickrate 66 -console -game tf -ip 91.196.207.67 -port 27015 +sv_lan 0 +maxplayers 33 +map ctf_2fort +servercfgfile server_1.cfg +motdfile motd_1.txt +mapcyclefile mapcycle_1.txt +sv_logsdir logs_1 +mm_pluginsfile addons/metamod/metaplugins_1.ini

srcds2.exe -heapsize 786432 -tickrate 100 -console -game tf -ip 91.196.207.67 -port 27016 +sv_lan 0 +maxplayers 33 +map ctf_2fort +servercfgfile server_2.cfg +motdfile motd_2.txt +mapcyclefile mapcycle_2.txt +sv_logsdir logs_2 +mm_pluginsfile addons/metamod/metaplugins_2.ini

in the end of server_1.cfg:
exec sourcemod/sourcemod1.cfg

in the end of server_2.cfg:
exec sourcemod/sourcemod2.cfg
Метамод 1.6.2 (можно и 1.7), Сорсмод 1.1
Так вот, сначала метамод ругается на то, что не может загрузить sourcepawn.jit.x86.dll от сорсмода в соответствующей папке, но если ее подпихнуть в папку sourcemod\bin, то все равно не грузится. Короче при таком раскладе (папке сорсмода отличной от sourcemod1) работоспособности добиться пока не удалось.

Почему и прошу поддержки. У кого имеется опыт - подскажите, как все 4 задачи малой кровью реализовать?

South
Разработчик
Разработчик
Сообщения: 287
Зарегистрирован: 18.06.2006
Откуда: с работы
Поблагодарили: 2 раза

#2 Сообщение 14.01.2009, 13:51

omgiafs
можно сделать ехе-шники, которые сами будут перезапускать сервер при крэше
и их уже запускать твоим скриптом при старте винды, тогда не нужен будет цикл
ЗЫ два сервака с одного srcds.exe прекрасно запускаются, правда какие глюки при этом будут не в курсе
все пропало

Аватара пользователя
Fedcomp
Нович0к
Нович0к
Сообщения: 23
Зарегистрирован: 12.01.2009
Контактная информация:

#3 Сообщение 14.01.2009, 13:56

Глюки будут, я два left 4 dead'а запускал сервера, так вот, через некоторое время они падали
[ Signature loaded on 98% ]

Lev2008
Лейтенант
Лейтенант
Сообщения: 221
Зарегистрирован: 08.11.2008

#4 Сообщение 15.01.2009, 00:01

Если глюки и будут, то не из-за того, что один файл два раза запустили, а из-за того, что сервер будет пытаться записывать в одни и те же файлы и папки. (Это как запустить два ворда, а потом пытаться один файл начать редактировать). Вот Вы тему начали для Соурс сервера, а я думал это же про HL1. Там проблема только одна - папка для логов. Хотелось бы логи в разные папки. А если моды разные - то без проблем из одной папки запускается (одним и тем же hlds).

omgiafs
Сержант
Сержант
Сообщения: 52
Зарегистрирован: 29.09.2005
Контактная информация:

#5 Сообщение 15.01.2009, 05:01

South писал(а):omgiafs
можно сделать ехе-шники, которые сами будут перезапускать сервер при крэше
и их уже запускать твоим скриптом при старте винды, тогда не нужен будет цикл
ЗЫ два сервака с одного srcds.exe прекрасно запускаются, правда какие глюки при этом будут не в курсе
Можно и с одного, согласен. Но тогда их в процессах различать не совсем сподручно. А так - наглядно.
А вообще согласен с мнением, что 2 и более серва в одной папке на винде - это геморрой последней стадии. По большому счету все дело в кривость модов уперлась. Может я и не прав, поправьте меня, но на текущий момент возможен только такой вариант с сорсмодом - он находится в одной стандартной папке, и грузятся только плагины, общие для всех серверов. Остальные лежат в папке "disabled" и подгружаются оттуда в конфиге каждого сервера.
Опять же вопрос может возникнуть по разной конфигурации сорсмодов для каждого сервера, хотя так мало кто заморачивается, в основном просто набор плагинов или их конфиги различаются - ВОТ В ЭТОМ и может быть проблема. Которая решается редактированием плагина либо (если он достаточно продвинут, что можно узнать только из исходников prankster ) переименованием файла плагина.

FireDaemon кстати не помог. Настроил службу, галка Desktop interact по дефолту отмечена, запускаю сервак, естественно "-console". Он стартует. Но его нигде не видно, окромя его процесса в диспетчере задач. Думаю, это связано с тем, что подключение к серверу осуществляется с помощью ремоут десктопа, а не используется локальный вход в систему. У себя на компе с локальным логином во всех учетках консоль сервака доступна, а на ремоуте - нету. Если это стандартная известная проблема - прошу объяснить путь решения. А городушки городить вроде запуска файрдемоном, а потом какой-нить тулзой еще и к консоли цепляться - это перебор. Но если толковая тулза есть - намекните, рассмотрю вариант :wink:

Что касается ехе-шников, которые сами будут перезапускать сервер при крэше - вот тут поподробнее. Имеется в виду монитор процесса? Или что-то другое?
По определению надо банально пробивать название окна (на предмет hostname) либо имя процесса (в случае srcds1.exe и srcds2.exe) и, если такового нет среди процессов, - выполнять консольную команду либо батник либо скрипт.
/UPD Вспомнил. Вообще-то есть такая мегатулза под названием nnCron :crazy:
/UPD2 А вот и печальная тема, к нашей проблеме имеет отношение. Так что крон может не сканать. http://www.nncron.ru/forums/viewtopic.php?f=5&t=9716
/UPD3 Нашел аналог крона - тоже русский и бесплатный. http://www.xstarter.com/rus/index.html
GUI у него подтормаживает, и антивирь его расколупывает долго, но главное - функционал. Он жирненький. Как на RDP в 2003x64 себя поведет - не знаю, но пока скажу - работает как надо. А именно нам надо 2 задачи.
1. Запускаем srcds1.exe с правами огрызка (юзера с огранич. правами) при логине юзера (с правами админа).
2. Запускаем srcds1.exe в случае закрытия srcds1.exe с теми же правами и параметрами.
И при этом все запуски-перезапуски пишем в лог-файл (это там очень просто реализовывается, без программирования).

South
Разработчик
Разработчик
Сообщения: 287
Зарегистрирован: 18.06.2006
Откуда: с работы
Поблагодарили: 2 раза

#6 Сообщение 15.01.2009, 10:51

omgiafs писал(а):FireDaemon кстати не помог. Настроил службу, галка Desktop interact по дефолту отмечена, запускаю сервак, естественно "-console". Он стартует. Но его нигде не видно, окромя его процесса в диспетчере задач. Думаю, это связано с тем, что подключение к серверу осуществляется с помощью ремоут десктопа, а не используется локальный вход в систему. У себя на компе с локальным логином во всех учетках консоль сервака доступна, а на ремоуте - нету. Если это стандартная известная проблема - прошу объяснить путь решения. А городушки городить вроде запуска файрдемоном, а потом какой-нить тулзой еще и к консоли цепляться - это перебор. Но если толковая тулза есть - намекните, рассмотрю вариант :wink:
я уж не знаю что это за служба, но вот вопрос: от чьего имени запускалась служба? если от SYSTEM, то и процесс srcds.exe запускался от имени SYSTEM и окно приложения на своем рабочем столе ты по идее не должен видеть, только в диспетчере задач процесс будет видно. в диспетчере кстати, написано от чьего имени запущен процесс. рдп, думаю, тут не при чем.
omgiafs писал(а):Что касается ехе-шников, которые сами будут перезапускать сервер при крэше - вот тут поподробнее. Имеется в виду монитор процесса? Или что-то другое?
По определению надо банально пробивать название окна (на предмет hostname) либо имя процесса (в случае srcds1.exe и srcds2.exe) и, если такового нет среди процессов, - выполнять консольную команду либо батник либо скрипт.
имеется ввиду мониторинг процесса по его ProcessID. если процесс отсутствует, то выполняется запуск процесса с изначальными параметрами. сюда глянь.

UPD прочитал что такое FireDaemon, поэтому поправка.
по идее все должно работать, хотя конечно не знаю каким способом он заставляет приложения запускаться как службы. себе не устанавливал за ненадобностью, поэтому не разбирался. а проблема возможно из-за того, что srcds - консольное приложение. это предположение
все пропало

Mean
Сержант
Сержант
Сообщения: 37
Зарегистрирован: 20.10.2007
Контактная информация:

#7 Сообщение 24.01.2009, 17:55

Для перезапуска сервера можно юзать софтину под названием HL Reanimator. Особенность серверов соурс\голдсоурс, что при критической ошибке они создают окно с описанием ошибки. И это окно висит, а процесс продолжает "работать", поэтому все утилиты считают что с сервером все в поряде. HL Reanimator же умеет прибивать эти окна с ошибками(ему только заголовки нужно скормить), и перезапускать сервер.
Последняя, вроде, 1.6.0.0
http://www.freesoft.ru/?id=668570
Тут была подпись когда-то

omgiafs
Сержант
Сержант
Сообщения: 52
Зарегистрирован: 29.09.2005
Контактная информация:

#8 Сообщение 26.01.2009, 06:08

Mean писал(а):Для перезапуска сервера можно юзать софтину под названием HL Reanimator. Особенность серверов соурс\голдсоурс, что при критической ошибке они создают окно с описанием ошибки. И это окно висит, а процесс продолжает "работать", поэтому все утилиты считают что с сервером все в поряде. HL Reanimator же умеет прибивать эти окна с ошибками(ему только заголовки нужно скормить), и перезапускать сервер.
Последняя, вроде, 1.6.0.0
http://www.freesoft.ru/?id=668570
На случай окошек у srcds есть параметр -nocrashdialog, лично мне помогает.
Касаемо hlr - поглядим, но надежды мало, так как это все равно что FireDaemon, только не навороченная и бесплатная. Погляжу как она под другого юзера косить будет.
По моим прикидкам должно заработать, потому что запускаться она будет при логине "ремоут-десктопного админа", и там уже соответственно от другого пользователя. Таким образом консоль должна быть доступна. Постараюсь довести дело до конца. Тут самое главное чтоб не заглючила hlr, так как она будет запускаться единоразово при логине РД-админа.

На данный же момент имею самый незамороченный вариант - серверы в разных папочках почивают. Но этого не избежать при использовании сорсмода, во всяком случае пока его не заточили под "многосерверность-однопапочность" prankster

После всех этих экспериментов имею вывод: для серверов, даже игровых, винда есть именно то, что не смайлике - :dash:

Lev2008
Лейтенант
Лейтенант
Сообщения: 221
Зарегистрирован: 08.11.2008

#9 Сообщение 31.01.2009, 18:24

omgiafs писал(а):После всех этих экспериментов имею вывод: для серверов, даже игровых, винда есть именно то, что не смайлике - :dash:
Да ладно, винда-то при чем, если игра не работает из одной папки два раза. :)
По теме: если хотите попасть в консоль винды (SessionID 0) пользуйте mstsc /console.
А что бы консоль сервера (srcds) была доступна и всё работало:
- создаете ограниченного пользователя (отдельная песня);
- даете права на запись этому юзеру в папку игрового сервера (особым пессимистам можно помучиться и дать права на запись только изменяемым файлам и папкам);
- заходите юзером, настраиваете запуск серверов (хоть тем же hlr);
Дальше два варианта:
- автологон этого юзера в консоль винды;
- даете юзеру право заходить по RDP и заходите по RDP, каждый раз когда электричество появляется после пропадания );

Вроде ничего не забыл.

Аватара пользователя
t0x1c_r1v3r
HL Fan
HL Fan
Сообщения: 412
Зарегистрирован: 03.08.2008
Благодарил (а): 2 раза
Поблагодарили: 13 раз

#10 Сообщение 31.01.2009, 20:28

omgiafs писал(а):вывод: для серверов, даже игровых, винда есть именно то, что не смайлике - :dash:
серверный фпс стабильнее на винде.. что бы кто не говорил

Добавлено спустя 31 секунду:
во всяком случае в хлдс
t_rrrrrrrrrrrrrrkl

South
Разработчик
Разработчик
Сообщения: 287
Зарегистрирован: 18.06.2006
Откуда: с работы
Поблагодарили: 2 раза

#11 Сообщение 01.02.2009, 00:28

Lev2008 писал(а):винда-то при чем, если игра не работает из одной папки два раза.
+1
Lev2008 писал(а):если хотите попасть в консоль винды (SessionID 0) пользуйте mstsc /console.
ты уверен что это поможет, если не одного юзера не приконекчено?

ЗЫ я так понимаю, нужно получить доступ к консоли севера, когда ни один юзер не приконкчен
по крайней мере я бы не позволил на своем серваке висеть залогиненому юзеру постоянно

ЗЗЫ данным вопросом (и смежным с этим) никогда не занимался, поэтому могу ошибаться. но мне кажется что это реализуемо

PPPS по мне так нужен инструмент с которого можно получить консоль сервера/отправить команду на сервер не логинясь к самому серверу (не заходя в винду).

что-то типа SRCDS Remote Monitor или SRCDS Remote Controller
все пропало

Lev2008
Лейтенант
Лейтенант
Сообщения: 221
Зарегистрирован: 08.11.2008

#12 Сообщение 02.02.2009, 07:34

South писал(а):
Lev2008 писал(а):если хотите попасть в консоль винды (SessionID 0) пользуйте mstsc /console.
ты уверен что это поможет, если не одного юзера не приконекчено?
Поможет или нет зависит от того, какую проблему решать. Но законнектиться в консоль можно независимо от того, есть ли приконнекченные юзеры или нет.
South писал(а):по крайней мере я бы не позволил на своем серваке висеть залогиненому юзеру постоянно
У меня висит, никаких проблем от этого не имею.
South писал(а):PPPS по мне так нужен инструмент с которого можно получить консоль сервера/отправить команду на сервер не логинясь к самому серверу (не заходя в винду).
что-то типа SRCDS Remote Monitor или SRCDS Remote Controller
Ну rcon, как вариант, - есть. А output не от команд можно в логе смотреть (правда с задержкой и там не всё).

South
Разработчик
Разработчик
Сообщения: 287
Зарегистрирован: 18.06.2006
Откуда: с работы
Поблагодарили: 2 раза

#13 Сообщение 02.02.2009, 14:10

Lev2008 писал(а):Поможет или нет зависит от того, какую проблему решать. Но законнектиться в консоль можно независимо от того, есть ли приконнекченные юзеры или нет
я про консоль srcds говорил. не уверен что ты ее сможешь увидеть, хотя не пробовал
Lev2008 писал(а):
South писал(а): по крайней мере я бы не позволил на своем серваке висеть залогиненому юзеру постоянно
У меня висит, никаких проблем от этого не имею.
ну мне во-первых не нравится сам факт висящего без дела юзера. во-вторых вин.сервак - лиц.. сервера терминалов нету. соответственно только 2 юзера могут приконектится (а тут уже 1 место занято получается). это еще одна причина.
Lev2008 писал(а):Ну rcon, как вариант, - есть. А output не от команд можно в логе смотреть (правда с задержкой и там не всё).
я думал про службу, которая будет запускать/рестартить серваки (srcds) и еще одну клиентскую прогу, которую можно было бы запустить у себя дома и получить консоль/отправить команду (srcds). т.е. никаких рдп нафиг не нужно было бы. в выходные было пару часов свободных, попытался набросок проги сделать, которая бы перехватывала вывод консоли. с cmd.exe все работает, а c srcds облом - при перенаправлении вывода консоли сервер падает. насколько понял в момент, когда пытается отрисовать верхнюю строку где фпс, карта, кол-во игроков. где там ковырять хз. если кто знает в чем может быть проблема подскажите, может тогда дальше буду ковыряться. если оно нужно конечно, вроде до недавнего времени проблем таких ни у кого не возникало
все пропало

Lev2008
Лейтенант
Лейтенант
Сообщения: 221
Зарегистрирован: 08.11.2008

#14 Сообщение 02.02.2009, 17:21

Я тоже попробовал набросать, но для hlds: Output ловится замечательно, а Input не идет что-то, хотя перехватывается. Можно правда для Input'a использовать локальный ркон, но это как-то замороченно.

omgiafs
Сержант
Сержант
Сообщения: 52
Зарегистрирован: 29.09.2005
Контактная информация:

#15 Сообщение 09.02.2009, 13:05

Ребята, для удаленной консоли есть HLSW prankster

А чтобы перехватывать лог консоли, его надо куда-то послать.
Проблемами "куда послать" занимается команда "logaddress_add IP:PORT"

Ответить