Solaris SMF如何确定某些东西是要维护还是要重新启动?



我有一个由SMF执行的我编写的守护进程。问题是当错误发生时,我有失败的代码,然后它需要从头开始重新启动。现在它正在发送sys.exit(0) (Python),但SMF一直将其抛出到维护模式。

我用过足够多的SMF,知道它有时会自动重启某些服务(并让其他服务失败并让您像这样处理它们)。如何将此进程归类为需要自动重启的进程?这是一个SMF设置,一种失败的方法,什么?

手册

Solaris使用svc中描述的startd/critical_failure_countstartd/critical_failure_period的组合。startd从:

startd/critical_failure_count

startd/critical_failure_period

critical_failure_countcritical_failure_period属性一起指定在svc之前的给定时间间隔内允许的最大业务故障数。startd将服务转入维护状态。如果在critical_failure_period秒内失败次数超过critical_failure_count,则svc。startd将服务过渡到维护。

源代码中的默认值

默认值可以在源代码中找到,该值取决于服务是否为"等待样式":

if (instance_is_wait_style(inst))
    critical_failure_period = RINST_WT_SVC_FAILURE_RATE_NS;
else
    critical_failure_period = RINST_FAILURE_RATE_NS;

默认值为5次失败/10分钟或5次失败/秒:

#define RINST_START_TIMES   5       /* failures to consider */
#define RINST_FAILURE_RATE_NS   600000000000LL  /* 1 failure/10 minutes */
#define RINST_WT_SVC_FAILURE_RATE_NS    NANOSEC /* 1 failure/second */

这些变量可以在SMF中设置为属性:

<service_bundle type="manifest" name="npm2es">
  <service name="site/npm2es" type="service" version="1">
    ...
    <property_group name="startd" type="framework">
      <propval name='critical_failure_count' type='integer' value='10'/>
      <propval name='critical_failure_period' type='integer' value='30'/>
      <propval name="ignore_error" type="astring" value="core,signal" />
    </property_group>
    ...
  </service>
</service_bundle>

TL;博士

检查startd值后,如果服务是"等待样式",它将被限制为1/秒的最大重启次数,直到它不再退出并出现非cfg错误。如果服务不是"等待式"的;

假设是一个正常的服务清单,我怀疑您正在进入维护阶段,因为SMF "太快"地重新启动您(这有点随意定义)。svcs -xv应该告诉你情况是否如此。如果是,SMF正在重新启动您,然后您再次快速退出,它决定放弃,直到问题解决(并且您已手动svcadm clear 'd它)。

我想知道退出0(并表示成功)是否会引起进一步的混乱,但似乎不会。

我不认为Oracle Solaris允许您调优SMF认为"太快"。

您必须创建一个服务清单。这比不复杂得多。这里有示例清单和清单结构文档。

http://www.oracle.com/technetwork/server storage/solaris/solaris - smf -清单- wp - 167902. - pdf

事实证明,我有两项技能来确保正确终止所有内容。第二个,自然地,是退出0以外的东西。将此更改为在脚本末尾包含exit 0解决了这个问题。

相关内容

  • 没有找到相关文章

最新更新