为什么即使方法以状态 0 退出,solaris smf 也会给出“方法或服务退出超时”

我对 Solaris SMF 非常陌生,并且正在为 Weblogic Nodemanager 编写 SMF。我按照以下步骤操作: http://www.camelrichard.org/controlling-weblogic-node-manager-solaris-smf-non-root

为了测试 SMF 是否在服务被终止时重新启动,我从另一个终端向它发送终止信号,但它不会重新启动。这是日志文件所说的:

[ Nov 19 10:17:39 Stopping because process received fatal signal from outside the service. ]
Killed
+ set +x
[ Nov 19 10:17:39 Executing stop method ("/usr/local/Oracle/Middleware/wlserver_10.3/server/bin/killNodeManager.sh") ]
Trying to find the PID of the nodeManager process
Cannot find the PID, NodeManager is not running - cannot kill
[ Nov 19 10:17:39 Method "stop" exited with status 0 ]
[ Nov 19 10:18:40 Method or service exit timed out.  Killing contract 100 ]

我不明白的是,如果您查看最后两行,第一行表示方法已退出,而第二行表示方法已超时。我觉得这很奇怪。有谁知道这里发生了什么? smf 的相关部分如下:

<service_bundle type='manifest' name='nodemanager'>
<service name='application/management/nodemanager' type='service' version='1'>

   <single_instance />

   <dependency
      name='multi-user-server'
      grouping='require_all'
      restart_on='error'
      type='service'>
      <service_fmri value='svc:/milestone/multi-user-server' />
   </dependency>

   <exec_method
      type='method'
      name='start'
      exec='/usr/local/Oracle/Middleware/wlserver_10.3/server/bin/startNodeManager2.sh'
      timeout_seconds='120' >
<!-- Trying as root for now :
      <method_context>
         <method_credential user='weblogic' group='weblogic' />
      </method_context>
-->
   </exec_method>

 <exec_method
  type='method'
  name='stop'
  exec='/usr/local/Oracle/Middleware/wlserver_10.3/server/bin/killNodeManager.sh'
  timeout_seconds='60' />
stack overflow Why is solaris smf giving "Method or service exit timed out" even when the method exits with status 0
原文答案

答案:

作者头像

第一条消息的原因:

方法“停止”以状态 0 退出

这是因为在您的方法脚本中执行的内容将位于 usr/local/Oracle/Middleware/wlserver_10.3/server/bin/startNodeManager2.sh

通常有效的方法将返回宏 SMF_EXIT_OK 我不确定为什么会出现第二条消息。必须与“killNodeManager.sh”相关

作者头像

它看起来像 killNodeManager.sh 有一个内部错误。它找不到应该停止的进程的 PID。所以,它很快就退出了,从它开始不到 1 秒就退出了。但是,从 SMF 的角度来看,与此服务相关的合同 #100 仍然有效。在为“停止”方法执行分配了 60 秒后,SMF 发现合约仍在运行,它别无选择,只能尝试终止整个合约。它合理地假设“停止”方法没有完成它的工作。因此,您会在日志中看到最后一条消息,并且服务会在终止合约后进入维护模式。

希望这可以帮助!