6

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

aaa90210
  • 351
  • 6
  • 15

3 Answers3

5

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
Johan Kaving
  • 113
  • 5
Martin
  • 809
  • 4
  • 6
  • It appears this *sort of* does what I want- however while this option does stop SMF restarting the service when child processes die, it now also ignores signals/coredumps on the primary process. While the primary process is reliable, it also defeats the purpose of using SMF at all if it cant restart the primary process when it dies. – aaa90210 Sep 02 '10 at 23:39
  • These service failures are detected by `contract(4)` events, so it still is able to monitor that for the process you are monitoring. – Martin Sep 03 '10 at 17:03
  • 1
    SMF should still notice if ALL processes for a contract go away and restart the service at that point. This is what happens with Apache if the parent process croaks. – eirescot Sep 05 '11 at 01:13
  • when i try the "on the fly" approach I get a message - No such property group 'startd' :( – ottodidakt Feb 20 '12 at 05:32
  • @bagheera see Latch M's answer below: you need to run "addpg startd framework" inside the svccfg shell first. – Dan Aug 08 '14 at 02:32
3

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.

ankon
  • 196
  • 3
1

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
Latch M
  • 11
  • 1