Чистое отключение Wakanda Server по сценарию

Как лучше всего выполнить чистое отключение сервера Wakanda с помощью сценариев оболочки OS X?

Это будет с решением, которое в настоящее время загружено и работает.


person Kirk    schedule 27.02.2016    source источник


Ответы (5)


Лучшая практика для предстоящего выпуска 1.1.0:

  • Обработайте событие applicationWillStop в служба для обработки конкретной логики закрытия приложения.
  • service wakanda stop для Ubuntu и обычный kill для Mac OS ( kill -9 всегда должен быть последним средством после некоторого тайм-аута, но в этом больше нет необходимости)

Лучшая практика для текущей версии 1.0.x:

  • Подготовьте остановку сервера, используя HTTP Request Handler или другой метод (убедитесь, что это очень хорошо защищено и принимаете соединения только с локального хоста)
  • service wakanda stop для Ubuntu и обычный kill для Mac OS ( kill -9 всегда должно быть последним средством после некоторого тайм-аута, но в этом больше нет необходимости)

Подробнее:

Мы должны различать HTTP-сервер, такой как Apache, и сервер приложений, такой как Wakanda Server.

Например, когда вы используете SharedWorker в Ваканде, вы создаете отдельный поток, который будет запускать некоторый код. Предположим, что рабочий выполняет какие-то важные манипуляции с данными. Если вы позволите серверу закрыть этого рабочего для вас, это может привести к несогласованности данных в вашем приложении. Поэтому вы должны обрабатывать любую специфичную для бизнес-логики «чистую» закрытие до того, как сервер остановит приложение.

Начиная с версии 1.1.0 вместо создания специального HTTP Request Handler, который можно вызвать для подготовки остановки сервера, можно использовать сервис, обрабатывающий событие applicationWillStop.

Когда сервер получает блокируемый сигнал уничтожения (TERM, QUIT, INT), он запускает процесс остановки (следующее верно для версии 1.1.x Wakanda Digital App Factory):

  • Уведомить каждую службу о событии applicationWillStop
  • Уведомить каждую службу о событии httpServerWillStop
  • Дождитесь завершения выполнения кода всех служб. Службы вызываются по одной (сервер ожидает, пока код, обрабатывающий событие, завершит свое выполнение, прежде чем вызывать следующую службу).
  • Отклонять любые новые входящие HTTP-запросы
  • Обработка всех HTTP-запросов в очереди HTTP-сервера.
  • Попросите всех рабочих и потоки, выполняющие код JS, остановить выполнение (включая код обработчиков запросов).
  • Проверьте, есть ли какие-либо потоки/контексты JS, которые все еще активны, если это так, подождите максимум 5 секунд.
  • Сервер заставляет все контексты JavaScript остановить выполнение и убивает все оставшиеся потоки.
  • Сервер ожидает закрытия потоков
  • Сервер останавливается

В версиях до 1.1.0 сервер просит рабочих закрыться, прежде чем уведомлять службы о событиях закрытия. Вот почему мы не могли полагаться на службы, чтобы полностью закрыть SharedWorkers.

person hamzahik    schedule 01.03.2016

Со всеми предложениями по использованию kill -9 имейте в виду, что kill -9 не выключает сервер Ваканды мягко.

Мы используем его уже несколько лет, и отключение сервера таким образом по-прежнему в некоторых случаях приводит к повреждению данных. Особенно, когда у вас есть общие рабочие процессы, работающие с базой данных в фоновом режиме. Ваканда не останавливает рабочих.

Наше текущее решение для минимизации проблемы: 1. Отправил REST-запрос в Ваканду, чтобы остановить воркеры (для этого вам нужно написать свой собственный метод на стороне сервера). Это все равно не остановит процессы во всех случаях! 2. Попытка убить сервер без параметра -9 (до трех раз) 3. Если сервер Ваканды еще жив, используйте kill -9

Кстати. мы просили об этом давно. Было бы полезно использовать какой-нибудь надежный инструмент командной строки, такой как: rcwakanda start/stop/restart, аналогичный другим службам, таким как apache.

person Michael Hong    schedule 29.02.2016
comment
Спасибо за мудрые слова об использовании kill -9, это действительно последняя возможная альтернатива, и ее не следует рассматривать как вариант, если его можно избежать. - person Blackus; 01.03.2016
comment
Было бы полезно использовать какой-нибудь надежный инструмент командной строки, такой как: rcwakanda start/stop/restart, аналогичный другим службам, таким как apache. - Соглашаться. Мы все время используем kill -9, большая часть наших данных проходит через базу данных 4D, поэтому у нас не было много проблем с повреждением. Но все равно не чисто. - person Aaron Lavers; 03.06.2016

Этот сценарий оболочки протестирован для работы в Mac OS:

#killWakanda.sh
pids=$(pgrep $1) 
kill -9 $pids

Зависит от того, используете ли вы версию для сообщества Wakanda версии Enterprise. Имя сервера Wakanda можно передать в качестве параметра (Wakanda Server или Wakanda Enterprise Server):

Это убивает Wakanda Enterprise Server

sh /pathOfShellScript/killWakanda.sh Wakanda Enterprise Server

Это убивает сервер сообщества Ваканды.

sh /pathOfShellScript/killWakanda.sh Wakanda Server
person Xiang Liu    schedule 27.02.2016


При запуске Wakanda Server в качестве фонового процесса вы можете аккуратно остановить его, используя идентификатор процесса и kill -sigterm< /а> команда.

SIGTERM

Сигнал SIGTERM отправляется процессу, чтобы запросить его завершение. В отличие от сигнала SIGKILL, он может быть перехвачен и интерпретирован или проигнорирован процессом. Это позволяет процессу выполнять красивое завершение, освобождая ресурсы и сохраняя состояние, если это необходимо. SIGINT почти идентичен SIGTERM.

Вот пример кода, демонстрирующий это:

ps -A | grep wakanda-server   
kill -SIGTERM pid_from_line_above

Примечание: вы должны заменить pid_from_line_above на PID, возвращаемый ps -A | grep wakanda-server


Для вашего сценария bash, возможно, сработает что-то вроде этого:

killall -TERM /Applications/Wakanda\ Server.app/Contents/MacOS/Wakanda\ Server
sleep 15
killall -KILL /Applications/Wakanda\ Server.app/Contents/MacOS/Wakanda\ Server

Сценарий сначала отправляет процессу обычный сигнал завершения, затем ждет 15 секунд, прежде чем отправить процессу сигнал уничтожения, заставляющий его завершить работу.

Напоминание: kill -SIGKILL PID нельзя перехватывать или игнорировать.

СИГКИЛЛ

Сигнал SIGKILL посылается процессу для его немедленного завершения (уничтожения). В отличие от SIGTERM и SIGINT, этот сигнал нельзя перехватить или проигнорировать, а процесс-получатель не может выполнить какую-либо очистку после получения этого сигнала.


Хотя лучшим способом сделать это может быть использование LaunchDaemon, как было предложено в ответ на скрипт оболочки startupitems osx не запускает приложение

См. также: Администрирование сервера Wakanda. для Unix

person Tim Penner    schedule 27.02.2016