通过OS X shell脚本执行干净关闭Wakanda服务器的最佳做法是什么?
这将是当前加载和运行的解决方案。
答案 0 :(得分:6)
即将发布的1.1.0版的最佳实践:
applicationWillStop
事件以处理应用特定的结算逻辑service wakanda stop
和对于Mac OS来说是正常的kill
(kill -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
在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
对于你的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
所建议的那样