Страница 1 из 2

Open Server и ОблачноеХранилище (Dropbox,GoogleDrive,MailDisk,YandexDisk,BTSync)

Добавлено: 26 апр 2014, 17:44
Zike
Если есть задача работать с одним и тем же Open Server на разных компьютерах (к примеру Работа - Дом) можно воспользоваться любым из ныне существующих Облачных сервисов в режиме синхронизации папок. В таком режиме работы существует проблема: Если Open Server одновременно работает на разных компьютерах это может вызвать непредсказуемые нестыковки в работе модулей т.к. по сути они работают с одними и теми же файлами. Далее предлагаю мой вариант решения данной проблемы.
Задача: Обеспечить работу только одного OpenServera в один момент времени.
Решение: Запущенный сервер каждую минуту следит за присутствием файла в определенной папке соответствующего его компьютеру и если его нет завершает свою работу... Соответственно при запуске сервера он должен зачистить в спец папке все файлы "чужых" компьютеров и создать свой, при этом гарантировано через минуту закроются все остальные не нужные копии Open Server на других компьютерах...
Реализация:
Всё в папке "OpenServer\userdata"
-Создаем папку "runtime"
-Создаем файл "pre_start.tpl.bat" с содержанием:
del /f /q %realprogdir%\userdata\runtime\*.runing
del /f /q %realprogdir%\userdata\runtime\%COMPUTERNAME%.stoped
@echo .>%realprogdir%\userdata\runtime\%COMPUTERNAME%.runing
-Создаем файл "post_stop.tpl.bat" с содержанием:
del /f /q %realprogdir%\userdata\runtime\%COMPUTERNAME%.runing
@echo .>%realprogdir%\userdata\runtime\%COMPUTERNAME%.stoped
-Создаем файл "server_test.bat" с содержанием:
@dir %~1\userdata\runtime\%COMPUTERNAME%.runing /a-d >nul 2>nul && (
  ECHO SERVER RUNS OK
) || (    
  "%~1\Open Server.exe" /stop
  "%~1\Open Server.exe" /exit    
)
- В настройках Планировщика Open Server прописываем запуск скрипта проверки каждую минуту:
Время: */1 * * * *
Выполнить: %COMSPEC% /c %realprogdir%\userdata\server_test.bat %realprogdir%

Добавлено: 27 апр 2014, 08:52
duxabilii
Только, ИМХО, лучше везде прописывать не %realprogdir%, a %progdir%, так как OpenServer может быть установлен в разные папки на разных компьютерах и тогда скрипты могут правильно не отрабатывать

Добавлено: 27 апр 2014, 09:41
Zike
Руководство:
%realprogdir% Реальный путь до папки с Open Server (обратный слеш "\")
%progdir% Генерируемый путь до папки с Open Server с учетом виртуального диска (обратный слеш "\")
Я это понимаю так:
- realprogdir будет всегда указывать на правильное размещение Open Server в какой бы папке он не находился на разных компьютерах.
- progdir будет ссылаться на виртуальный диск и если он не подмонтирован то и пути будут недействительными...
Поправьте если я ошибаюсь.

Добавлено: 27 апр 2014, 10:27
Максим
Zike, у вас всё хорошо и правильно, никого не слушайте.

Добавлено: 27 апр 2014, 15:05
duxabilii
Zike писал(а):Поправьте если я ошибаюсь.
У меня: OpenServer установлен на одном компе на диск D:\, а на другом на диск F:\. При запуске второй копии подменяется сгенерированный cron.tab и, соответственно, OpenServer не может завершить работу. Вот лог CRON'a
27 Apr 15:01:00 Start: C:\Windows\system32\cmd.exe /c F:\AeroFS\OpenServer\userdata\server_test.bat F:\AeroFS\OpenServer
27 Apr 15:01:00 Start result: 0
27 Apr 15:02:00 Start: C:\Windows\system32\cmd.exe /c F:\AeroFS\OpenServer\userdata\server_test.bat F:\AeroFS\OpenServer
27 Apr 15:02:00 Start result: 0
27 Apr 15:02:30 Load cron.tab
27 Apr 15:03:00 Start: C:\Windows\system32\cmd.exe /c F:\AeroFS\OpenServer\userdata\server_test.bat D:\AeroFS\OpenServer
27 Apr 15:03:00 Start result: 0
27 Apr 15:04:00 Start: C:\Windows\system32\cmd.exe /c F:\AeroFS\OpenServer\userdata\server_test.bat D:\AeroFS\OpenServer
27 Apr 15:04:00 Start result: 0

Максим, может нужно добавить такой функционал в OpenServer, чтобы при запуске проверялось на запуск на разных компьютерах и при выявлении одновременно запущенных процессов спрашивало: "OpenServer запущен на нескольких компьютерах. Закрыть остальные копии?"

Добавлено: 27 апр 2014, 17:41
Zike
Да, duxabilii, Вы правы, данная реализация не совсем корректна потому что всё же некоторое время сервера работают одновременно и случаются накладки... Вариант с %progdir% тоже не везде проходит - у многих не создается виртуальный диск. Я вижу такой вариант решения: Либо ручками удалять все файлы в userdata\runtime и выдержать паузу минуту на крон и скажем еще минуту-две на гарантированую синхронизацию всех измененых файлов с удаленного компа и только потом запускать сервер на новом компе, ну или всё тоже самое вставив паузу в файл pre_start.tpl.bat к примеру командой
ping -n %SEC% 127.0.0.1 > NUL
где вместо %SEC% прописать количество секунд плюс один... Почему именно ping, а не sleep или timeout, дело в том что ping гарантировано отработает на всех Windows.

А еще еслиб Open Server отрабатывал дополнительные батники во время запуска и завершения работы OpenServer.exe и скажем крон по галочке можно было бы запускать не только когда запущен сервер но и когда он остановлен при работающем OpenServer.exe можно было бы более гибче настроить систему скажем на автоматический или удаленный запуск

Добавлено: 27 апр 2014, 20:42
duxabilii
Нужно подумать, тема интересна, я думаю. многим пользователям. Только руки не доходили.
Может и вправду Максиму посмотреть и внести подобный функционал в программу (сделав его отключаемым в настройках).

Или можно попробовать запускать openServer через BAT-файл
del /f /q %CD%\userdata\runtime\*.runing
del /f /q %CD%\userdata\runtime\%COMPUTERNAME%.stoped
@echo .>%CD%\userdata\runtime\%COMPUTERNAME%.runing
ping -n 61 127.0.0.1 > NUL
"%CD%\Open Server.exe" /start

Добавлено: 28 апр 2014, 20:30
Zike
Вот еще один вариант:
pre_start.tpl.bat
REM Удалили все файлы *.check, Даем команду на закрытие сервера
del /f /q %realprogdir%\userdata\runtime\*.check
del /f /q %realprogdir%\userdata\runtime\%COMPUTERNAME%.runing

REM Ожидаем остановки серверов (отсутствие *.runing)
:check
@dir %realprogdir%\userdata\runtime\*.runing /a-d >nul 2>nul && (
  ping -n 1 127.0.0.1 > NUL
  goto :check 
)
 
REM Делаем паузу на синхронизацию
ping -n 10 127.0.0.1 > NUL

REM Создаем свои файлы    
del /f /q %realprogdir%\userdata\runtime\%COMPUTERNAME%.stoped
@echo .>%realprogdir%\userdata\runtime\%COMPUTERNAME%.runing
@echo .>%realprogdir%\userdata\runtime\%COMPUTERNAME%.check
post_stop.tpl.bat
@del /f /q %realprogdir%\userdata\runtime\%COMPUTERNAME%.check
@del /f /q %realprogdir%\userdata\runtime\%COMPUTERNAME%.runing
@echo .>%realprogdir%\userdata\runtime\%COMPUTERNAME%.stoped
server_check.bat
@set count=1
:cikl
@dir %~1\userdata\runtime\%COMPUTERNAME%.check /a-d >nul 2>nul && (
  if %count% LEQ 3 (  
    @echo Cikl %count%    
    @ping -n 20 127.0.0.1 > NUL
    @set /a count+=1    
    goto :cikl
  )  
) || (    
  "%~1\Open Server.exe" /exit    
)
Планировщик
%COMSPEC% /c %realprogdir%\userdata\server_check.bat "%realprogdir%"
Как работает.
Т.к. сервер не запустится до тех пор пока не отработает pre_start.tpl.bat мы можем в этом батнике ожидать закрытия других копий Open Server - ждем пока не исчезнут все "*.runing", делаем паузу на синхронизацию с облаком и запускаем нашу копию сервера. Сервер создает два файла %COMPUTERNAME%.check и %COMPUTERNAME%.runing.
%COMPUTERNAME%.check - по его отсутствию в планировщике узнаем надо ли нам закрывать свою копию сервера и по факту как закроем удаляем свой %COMPUTERNAME%.runing по отсутствию которого другой сервер поймет что можно уже запускаться...

server_check.bat - в планировщике проверяет нужно ли закрывать сервер (отсутствует %COMPUTERNAME%.check). За один запуск проверяет три раза с паузой в 20 секунд (на 0 секунде, 20 секунде, 40 секунде) тем самым обходим ограничение крона в 1 минуту

Добавлено: 11 июн 2014, 20:25
Максим
duxabilii писал(а):Максим, может нужно добавить такой функционал в OpenServer, чтобы при запуске проверялось на запуск на разных компьютерах и при выявлении одновременно запущенных процессов спрашивало: "OpenServer запущен на нескольких компьютерах. Закрыть остальные копии?"
1) Я вижу другой выход из этой проблемы - выключать Open Server на работе, когда идёшь домой. Тогда и не нужно будет извращаться с батниками.

2) Если же первый пункт не осуществим по разным причинам (например не знаю в каком корпусе буду когда закончится рабочий день, отпустили раньше, всех вызвали на субботник пока я был в столовой, набухался на работе и пошел домой и т.д.) то в этом случае прекрасно помогает удалённая панель управления Open Server. Пришел домой - зашел в панельку, выключил тот Open Server который на работе, включил домашний.

Вот и всё.

Добавлено: 11 июн 2014, 21:08
nick
:) А я через teamviewer выключаю дома/на работе и все.