通过 OS X shell 脚本完全关闭 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 Server 这样的应用程序服务器。
例如,当您SharedWorker
在 Wakanda 中使用 a 时,您正在创建一个单独的线程来运行一些代码。假设工人正在做某种关键的数据操作。如果您让服务器为您关闭该工作程序,则可能会导致您的应用程序中的数据不一致。因此,您应该在服务器停止应用程序之前处理任何特定于业务逻辑的“干净”关闭。
从版本 1.1.0 开始HTTP Request Handler
,您可以使用处理事件的服务,而不是创建可以调用以准备服务器停止的特殊内容applicationWillStop
。
当服务器收到可阻塞的终止信号(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 来关闭 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()。
这个 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
当 Wakanda Server 作为后台进程运行时,您可以使用进程 ID 和kill -sigterm
命令完全停止它。
SIGTERM
SIGTERM 信号被发送到进程以请求其终止。与 SIGKILL 信号不同,它可以被进程捕获、解释或忽略。这允许进程执行良好的终止释放资源并在适当的情况下保存状态。SIGINT 几乎与 SIGTERM 相同。
下面是一些示例代码来演示这一点:
ps -A | grep wakanda-server
kill -SIGTERM pid_from_line_above
注意:您必须用返回的 PID 替换 pid_from_line_aboveps -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 作为响应osx startupitems shell 脚本不启动应用程序的建议