我有一个由 SMF 执行的守护进程。问题是发生错误时,我有失败代码,然后需要从头开始重新启动。现在它正在发送 sys.exit(0) (Python),但 SMF 一直将其置于维护模式。
我已经与 SMF 合作过,知道它有时会自动重新启动某些服务(并让其他服务失败并让您像这样处理它们)。如何将此进程归类为需要自动重启的进程?它是一个 SMF 设置,一种失败的方法,什么?
Solaris 使用svc.startd 手册页中描述的startd/critical_failure_count
和的组合:startd/critical_failure_period
开始/critical_failure_count
开始/critical_failure_period
critical_failure_count
和属性一起指定在svc.startd将服务转换为维护之前的给定时间间隔内允许的critical_failure_period
最大服务失败次数。如果失败次数超过任何秒数,svc.startd会将服务转换为维护。critical_failure_count
critical_failure_period
默认值可以在源代码中找到,该值取决于服务是否为“等待样式”:
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>
在检查 startd 值后,如果服务是“等待方式”,它将被限制为 1/sec 的最大重启,直到它不再因非 cfg 错误而退出。如果服务不是“等待方式”,它将进入维护模式。
假设一个正常的服务清单,我怀疑你正在进入维护,因为 SMF正在“太快”重新启动你(这有点武断)。 svcs -xv
应该告诉你是不是这样。如果是,SMF 正在重新启动您,然后您又快速退出,它决定放弃,直到问题得到解决(并且您已经手动解决svcadm clear
了它。
我想知道退出 0(并表示成功)是否会导致进一步的混乱,但似乎不会。
我不认为 Oracle Solaris 允许您调整 SMF 认为“太快”的内容。
事实证明,我连续两次 pkill 以确保一切都正确终止。第二个,自然而然地退出了0
. 将其更改exit 0
为在脚本末尾包含一个解决了该问题。
您必须创建一个服务清单。这比没有更复杂。这有示例清单并记录清单结构。
http://www.oracle.com/technetwork/server-storage/solaris/solaris-smf-manifest-wp-167902.pdf