我有一个我写的守护进程正在由SMF执行。问题是当发生错误时,我有失败的代码,然后它将需要从头开始。现在它正在发送sys.exit(0) (Python),但是SMF一直在维护模式下抛出它。
我使用SMF的经验足够多,我知道它有时会自动重启某些服务(并让其他服务失败,让您像这样处理它们)。如何将此进程归类为需要自动重新启动的进程?它是SMF设置,还是失败的方法,还是什么?
发布于 2013-04-19 03:30:00
事实证明,我连续执行了两次pkill,以确保所有操作都正确终止。第二个原因自然是退出了0之外的其他东西。将其更改为在脚本末尾包含一个exit 0解决了该问题。
发布于 2015-12-18 04:45:48
手册页
Solaris使用startd/critical_failure_count和startd/critical_failure_period的组合,如svc.startd manpage中所述
启动/严重故障计数
开始时间/关键故障周期
critical_failure_count和critical_failure_period属性一起指定在svc.startd将服务转换为维护之前,在给定时间间隔内允许的最大服务失败次数。如果在任何critical_failure_period秒内故障次数超过critical_failure_count,svc.startd会将服务转换为维护。
源代码中的缺省值
默认值可以在源代码中找到,即值depends on whether the service is "wait style"
if (instance_is_wait_style(inst))
critical_failure_period = RINST_WT_SVC_FAILURE_RATE_NS;
else
critical_failure_period = RINST_FAILURE_RATE_NS;缺省值为5 failures/10 minutes or 5 failures/second
#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 as properties中设置这些变量
<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;DR
在检查Startd值之后,如果服务是"wait style",它将是 ,直到它不再以非cfg错误退出。如果服务不是"wait style“,它将是 .
发布于 2013-04-19 02:22:14
假设一个正常的服务清单,我会怀疑您正在放弃维护,因为SMF正在“太快”地重新启动您(这有点随意定义)。如果是这样,svcs -xv应该会告诉你。如果是这样,SMF会重新启动你,然后你又快速退出,它决定放弃,直到问题解决(并且你已经手动svcadm clear了它。
我想知道退出0(并表示成功)是否会导致进一步的混乱,但似乎不会。
我不认为Oracle Solaris允许您调整SMF认为“太快”的内容。
https://stackoverflow.com/questions/16070734
复制相似问题