5

通过 OS X shell 脚本完全关闭 Wakanda 服务器的最佳做法是什么?

这将与当前加载和运行的解决方案一起使用。

4

5 回答 5

6

即将发布的 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
  • 等待所有服务代码执行完成 - 一次调用一个服务(服务器等待处理事件的代码结束其执行,然后再调用下一个服务) -
  • 拒绝任何新的传入 HTTP 请求
  • 处理 HTTP Server 队列中的所有 HTTP 请求
  • 要求所有执行 JS 代码的工作人员和线程停止执行(包括请求处理程序代码)。
  • 检查是否有任何线程/JS 上下文仍然处于活动状态,如果是,请等待最多 5 秒。
  • 服务器强制所有 JavaScript 上下文停止执行并杀死所有剩余线程
  • 服务器等待线程关闭
  • 服务器停止

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

于 2016-03-01T15:14:28.560 回答
5

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

我们已经使用了好几年了,在某些情况下,以这种方式关闭服务器仍然会导致数据损坏。尤其是当您有共享工作人员在后台使用数据库时。瓦坎达并没有彻底阻止工人。

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

顺便提一句。我们很久以前就要求这个。一些可靠的命令行工具,例如:rcwakanda start/stop/restart,类似于 apache 等其他服务会有所帮助。

于 2016-02-29T11:07:30.093 回答
3

我和迈克尔·洪有同样的经历。我不会使用 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()。

于 2016-02-29T19:06:31.157 回答
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
于 2016-02-27T20:54:33.307 回答
1

当 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 脚本不启动应用程序的建议

另请参阅:管理 Unix 的 Wakanda 服务器

于 2016-02-27T17:56:22.310 回答