【问题标题】:Wakanda Server scripted clean shutdownWakanda Server 脚本式干净关闭
【发布时间】:2016-02-27 15:13:12
【问题描述】:

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

这将使用当前加载并运行的解决方案。

【问题讨论】:

    标签: bash server shutdown wakanda


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

      • 感谢关于使用 kill -9 的明智言论,这确实是最后可能的替代方案,如果可以避免,则不应将其视为一种选择。
      • "一些可靠的命令行工具,例如:rcwakanda start/stop/restart,类似于 apache 等其他服务会有所帮助。" - 同意。我们一直在使用 kill -9,我们的大部分数据都通过 4D 数据库,所以我们没有遇到很多损坏问题。但还是不干净。
      【解决方案3】:

      此 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
      

      【讨论】:

        【解决方案4】:

        我和 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()。

        【讨论】:

          【解决方案5】:

          当 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

          另请参阅:Administrating Wakanda Server for Unix

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-06-01
            • 2013-12-27
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多