Как лучше всего выполнить чистое отключение сервера Wakanda с помощью сценариев оболочки OS X?
Это будет с решением, которое в настоящее время загружено и работает.
Как лучше всего выполнить чистое отключение сервера Wakanda с помощью сценариев оболочки OS X?
Это будет с решением, которое в настоящее время загружено и работает.
Лучшая практика для предстоящего выпуска 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
В версиях до 1.1.0 сервер просит рабочих закрыться, прежде чем уведомлять службы о событиях закрытия. Вот почему мы не могли полагаться на службы, чтобы полностью закрыть SharedWorkers
.
Со всеми предложениями по использованию kill -9 имейте в виду, что kill -9 не выключает сервер Ваканды мягко.
Мы используем его уже несколько лет, и отключение сервера таким образом по-прежнему в некоторых случаях приводит к повреждению данных. Особенно, когда у вас есть общие рабочие процессы, работающие с базой данных в фоновом режиме. Ваканда не останавливает рабочих.
Наше текущее решение для минимизации проблемы: 1. Отправил REST-запрос в Ваканду, чтобы остановить воркеры (для этого вам нужно написать свой собственный метод на стороне сервера). Это все равно не остановит процессы во всех случаях! 2. Попытка убить сервер без параметра -9 (до трех раз) 3. Если сервер Ваканды еще жив, используйте kill -9
Кстати. мы просили об этом давно. Было бы полезно использовать какой-нибудь надежный инструмент командной строки, такой как: rcwakanda start/stop/restart, аналогичный другим службам, таким как apache.
kill -9
, это действительно последняя возможная альтернатива, и ее не следует рассматривать как вариант, если его можно избежать.
- person Blackus; 01.03.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
У меня был тот же опыт, что и у Майкла Хонга. Я бы не стал использовать kill -9 для выключения сервера Ваканды. Он не корректно завершает работу рабочих процессов и может привести к повреждению данных. Правильный способ выключения сервера Ваканды — использовать функцию solution.quitServer(), как описано здесь: http://doc.wakanda.org/home2.en.html#/Global-Application/Solution/quitServer.301-635546.en.html а>
Мое решение состояло в том, чтобы иметь одного общего работника, который управляет всеми остальными работниками («менеджер рабочих»). Вызов RPC/REST может быть сделан, чтобы вызвать «рабочего менеджера» для выхода из сервера. Затем менеджер воркеров вызывает всех остальных воркеров, чтобы дать им время изящно закрыться. Затем, через X секунд, рабочий менеджер вызывает решение.quitServer().
При запуске 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