【发布时间】:2016-02-27 15:13:12
【问题描述】:
通过 OS X shell 脚本彻底关闭 Wakanda 服务器的最佳做法是什么?
这将使用当前加载并运行的解决方案。
【问题讨论】:
标签: bash server shutdown wakanda
通过 OS X shell 脚本彻底关闭 Wakanda 服务器的最佳做法是什么?
这将使用当前加载并运行的解决方案。
【问题讨论】:
标签: bash server shutdown wakanda
即将发布的 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 应该始终是某种超时后的最后手段,但这不再是必要的了)
更多细节:
我们应该区分像 Apache 这样的 HTTP 服务器和像 Wakanda 服务器这样的应用程序服务器。
例如,当您在 Wakanda 中使用 SharedWorker 时,您正在创建一个单独的线程来运行一些代码。假设工人正在做某种关键的数据操作。如果您让服务器为您关闭该工作程序,则可能会导致您的应用程序中的数据不一致。因此,您应该在服务器停止应用程序之前处理任何特定于业务逻辑的“干净”关闭。
从版本 1.1.0 开始,您可以使用处理事件 applicationWillStop 的服务,而不是创建可以调用以准备服务器停止的特殊 HTTP Request Handler。
当服务器接收到一个可阻塞的终止信号(TERM, QUIT, INT),它会开始停止进程(Wakanda Digital App Factory 1.1.x 版本的情况如下):
applicationWillStop httpServerWillStop
在 1.1.0 之前的版本中,服务器会在通知服务关闭事件之前要求工作人员关闭。这就是为什么我们不能依靠服务来彻底关闭SharedWorkers。
【讨论】:
关于使用 kill -9 的所有建议,请注意 kill -9 不会以温和的方式关闭 Wakanda 服务器。
我们已经使用了好几年了,以这种方式关闭服务器在某些情况下仍然会导致数据损坏。特别是当您有共享工作人员在后台使用数据库时。 瓦坎达并没有彻底阻止工人。
我们目前最小化问题的解决方案是: 1. 向 Wakanda 发送 REST 请求以停止工作人员(您必须为此编写自己的服务器端方法)。在所有情况下,这仍然不会关闭进程! 2. 不带-9参数尝试杀掉服务器(最多3次) 3.如果Wakanda服务器还活着,使用kill -9
顺便说一句。我们很久以前就要求这个。一些可靠的命令行工具,例如: rcwakanda start/stop/restart 类似于 apache 等其他服务会有所帮助。
【讨论】:
kill -9 的明智言论,这确实是最后可能的替代方案,如果可以避免,则不应将其视为一种选择。
此 shell 脚本经过测试可在 Mac OS 中运行:
#killWakanda.sh
pids=$(pgrep $1)
kill -9 $pids
取决于您运行的是企业版的 Wakanda 社区版。 Wakanda 服务器的名称可以作为参数传入(Wakanda Server 或 Wakanda Enterprise Server):
这会杀死 Wakanda 企业服务器
sh /pathOfShellScript/killWakanda.sh Wakanda Enterprise Server
这会杀死 Wakanda 社区服务器
sh /pathOfShellScript/killWakanda.sh Wakanda Server
【讨论】:
我和 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 调用来调用“worker manager”以退出服务器。然后,工人经理呼叫所有其他工人,让他们有时间优雅地关闭。然后 X 秒后,worker manager 调用 solution.quitServer()。
【讨论】:
当 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 -SIGKILL PID 不能被捕获或忽略。
SIGKILL
SIGKILL 信号被发送到一个进程以使其立即终止(kill)。与 SIGTERM 和 SIGINT 相比,该信号不能被捕获或忽略,并且接收进程在接收到该信号后也不能进行任何清理。
虽然这样做的更好方法可能是按照osx startupitems shell script does not launch application 的建议使用 LaunchDaemon
【讨论】: