Solaris SMF kill service because child dies

I am using SMF to manage a service under Solaris10.

This service is itself a process manager, and forks off many child processes, some of which die occasionally (or are killed for various reasons). The service process itself is very robust and never dies however.

The problem I have is that when I manually kill one of these child processes using the KILL signal, SMF will restart the main service:

[ Aug 27 08:07:06 Stopping because process received fatal signal from outside the service. ]

Is there a way I can configure SMF or the service manifest such that SMF will not kill the service if one of the service sub-processes gets killed?

TIA


Solution 1:

You need to set the following in your manifest:

<property_group name='startd' type='framework'>
    <!-- sub-process core dumps shouldn't restart session -->
    <propval name='ignore_error' type='astring' value='core,signal' />
</property_group>

Or you can do it on the fly with:

svccfg -s svc:/your/service:default
svccfg> setprop startd/ignore_error = astring:"core,signal"
svccfg> ^D

Solution 2:

I've had the same problem just now, and was able to solve it by changing the service process itself to start the childs wrapped inside /usr/sbin/ctrun -l child <command-and-arguments>. The manifest itself uses the "child" service model.

See contract(4) and ctrun(1) for details.

Solution 3:

if you try the on the fly method and get No such property group 'startd' you need to add the property first.

svccfg -s svc:/your/service:default
svccfg> addpg startd framework
svccfg> setprop startd/ignore_error = astring:"core,signal"
svccfg> ^D