Wakanda Server脚本清理关闭

时间:2016-02-27 15:13:12

标签: bash server shutdown wakanda

通过OS X shell脚本执行干净关闭Wakanda服务器的最佳做法是什么?

这将是当前加载和运行的解决方案。

5 个答案:

答案 0 :(得分:6)

即将发布的1.1.0版的最佳实践:

  • 处理service上的applicationWillStop事件以处理应用特定的结算逻辑
  • 对于Ubuntu来说,
  • service wakanda stop和对于Mac OS来说是正常的killkill -9应该在某种超时后永远是最后的手段,但这不再是必要的了。)

当前版本1.0.x的最佳实践:

  • 使用HTTP Request Handler或其他方法准备服务器停止(确保非常好地保护服务器并仅接受来自localhost的连接)
  • service wakanda stop用于Ubuntu,而普通kill用于Mac OS(kill -9应该始终是在某种超时后的最后手段,但这不再是必要的了)

更多详情:

我们应该区分像Apache这样的HTTP服务器和像Wakanda Server这样的应用服务器。

例如,当您在Wakanda中使用SharedWorker时,您正在创建一个单独的线程来运行一些代码。假设工作人员正在进行某种关键数据操作。如果您让服务器为您关闭该工作程序,则可能会导致应用程序中的数据不一致。因此,您应该处理任何特定的业务逻辑" clean"在服务器停止应用程序之前关闭。

从版本1.1.0开始,您可以使用处理事件HTTP Request Handler的服务,而不是创建可以调用以准备服务器停止的特殊applicationWillStop。 / p>

当服务器收到可阻止的终止信号(TERM,QUIT,INT)时,它将启动停止过程(对于Wakanda Digital App Factory的1.1.x版,以下情况属实):

  • 通知活动applicationWillStop
  • 的每项服务
  • 通知活动httpServerWillStop
  • 的每项服务
  • 等待所有服务代码执行完成 - 一次调用一个服务(服务器在调用下一个服务之前等待处理事件的代码结束执行) -
  • 拒绝任何新的传入HTTP请求
  • 处理HTTP服务器队列中的所有HTTP请求
  • 要求执行JS代码的所有工作人员和线程停止执行(包括请求处理程序代码)。
  • 检查是否有任何线程/ JS上下文仍处于活动状态,如果是等待最多5秒。
  • 服务器强制所有JavaScript上下文停止执行 杀死所有剩余的线程
  • 服务器等待线程关闭
  • 服务器停止

在1.1.0之前的版本中,服务器要求工作人员在向服务通知结束事件之前关闭。这就是为什么我们不能依靠这些服务来彻底清除SharedWorkers

答案 1 :(得分:5)

有了使用kill -9的所有建议,请注意kill -9不会轻轻关闭Wakanda服务器。

我们现在使用它已经好几年了,在这种情况下关闭服务器仍会导致数据损坏。特别是当您在后台共享使用数据库的工作人员时。 Wakanda没有干净地阻止工人。

我们目前最小化问题的解决方案是: 1.向Wakanda发送一个REST请求以阻止工作者(您必须为此编写自己的服务器端方法)。在所有情况下,这仍然不会关闭进程! 2.尝试在没有-9参数的情况下终止服务器(最多三次) 3.如果Wakanda服务器仍然存在,请使用kill -9

顺便说一下。我们很久以前就问过这件事。一些可靠的命令行工具,如: rcwakanda启动/停止/重启类似于其他服务,如apache会有所帮助。

答案 2 :(得分:3)

此shell脚本在Mac OS中经过测试:

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

取决于您是否正在运行Wakanda社区版企业版。 Wakanda服务器的名称可以作为参数传递(Wakanda Server或Wakanda Enterprise Server):

这会杀死Wakanda Enterprise Server

sh /pathOfShellScript/killWakanda.sh Wakanda Enterprise Server

这会杀死Wakanda社区服务器

sh /pathOfShellScript/killWakanda.sh Wakanda Server

答案 3 :(得分:3)

我和Michael Hong有过相同的经历。我不会使用kill -9来关闭Wakanda服务器。它没有优雅地关闭工作人员,并可能导致数据损坏。关闭Wakanda服务器的正确方法是使用solution.quitServer()函数,如下所示: http://doc.wakanda.org/home2.en.html#/Global-Application/Solution/quitServer.301-635546.en.html

我的解决方案是让一个共享工作者管理所有其他工作人员(“工人经理”)。可以进行RPC / REST调用以调用“工作管理器”以退出服务器。然后,工人经理打电话给所有其他工人,让他们有时间优雅地关闭。然后在X秒后,工作管理器调用solution.quitServer()。

答案 4 :(得分:1)

将Wakanda Server作为后台进程运行时,可以使用进程ID和kill -sigterm命令干净地停止它。

  

SIGTERM

     

SIGTERM信号被发送到进程以请求终止。与SIGKILL信号不同,该过程可以捕获,解释或忽略它。这允许进程执行良好的终止释放资源并在适当时保存状态。 SIGINT几乎与SIGTERM完全相同。

以下是一些示例代码:

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

注意:您必须将pid_from_line_above替换为ps -A | grep wakanda-server

返回的PID

对于你的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信号发送给进程,强制它退出。

提醒:kill -SIGKILL PID无法被捕获或忽略。

  

SIGKILL

     

SIGKILL信号被发送到进程以使其立即终止(kill)。与SIGTERM和SIGINT相反,此信号无法捕获或忽略,接收过程无法在接收到此信号时执行任何清理。

虽然更好的方法是使用LaunchDaemon,如响应osx startupitems shell script does not launch application

所建议的那样

另请参阅:Administrating Wakanda Server for Unix