我有一个由SMF执行的我编写的守护进程。问题是当错误发生时,我有失败的代码,然后它需要从头开始重新启动。现在它正在发送sys.exit(0) (Python),但SMF一直将其抛出到维护模式。
我用过足够多的SMF,知道它有时会自动重启某些服务(并让其他服务失败并让您像这样处理它们)。如何将此进程归类为需要自动重启的进程?这是一个SMF设置,一种失败的方法,什么?
手册
Solaris使用svc中描述的startd/critical_failure_count
和startd/critical_failure_period
的组合。startd从:
startd/critical_failure_count
startd/critical_failure_period
critical_failure_count
和critical_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
解决了这个问题。