I seem not to understand what contract deems to be "fatal" and 
"non-fatal" signal.

### Case 1: Start up sendmail, set hwerr and signal to be fatal event.

# ctrun -V -r 0 -o noorphan -f hwerr,signal 
/lib/svc/method/smtp-sendmail start &
[1] 3558
# ctrun(3558): created contract id 326

# ctstat -vi 326
CTID    ZONEID  TYPE    STATE   HOLDER  EVENTS  QTIME   NTIME
326     0       process owned   3558    0       -       -
         cookie:                0
         informative event set: core
         critical event set:    signal hwerr empty
         fatal event set:       signal hwerr
         parameter set:         noorphan
         member processes:      3563 3565
         inherited contracts:   none

Kill SIGTERM one sendmail process, one remains.

# kill 3563
# ctstat -vi 326
CTID    ZONEID  TYPE    STATE   HOLDER  EVENTS  QTIME   NTIME
326     0       process owned   3558    0       -       -
         cookie:                0
         informative event set: core
         critical event set:    signal hwerr empty
         fatal event set:       signal hwerr
         parameter set:         noorphan
         member processes:      3565
         inherited contracts:   none

Kill SIGTERM that one too.  Everybody dies.  And stays dead, no restart. 
  Despite that critical event included "empty".  Must I inform ctrun 
somehow that I want it to restart on critical event as well, and not 
just fatal event?

# kill 3565
# ctrun(3558): event from contract 326: contract empty
[1]    Done                          ctrun -V -r 0 -o noorphan -f 
hwerr,signal /lib/svc/method/smtp-sendmail start


### Case 2: (same as case 1) Start up sendmail, set hwerr and signal to 
be fatal event.

# ctrun -V -r 0 -o noorphan -f hwerr,signal 
/lib/svc/method/smtp-sendmail start &
[1] 3571
# ctrun(3571): created contract id 327

# ctstat -vi 327
CTID    ZONEID  TYPE    STATE   HOLDER  EVENTS  QTIME   NTIME
327     0       process owned   3571    0       -       -
         cookie:                0
         informative event set: core
         critical event set:    signal hwerr empty
         fatal event set:       signal hwerr
         parameter set:         noorphan
         member processes:      3576 3578
         inherited contracts:   none

Kill SIGKILL one sendmail process.  ctrun detect signal event, kills 
what's left in the old contract, starts a new one.

# kill -9 3578
# ctrun(3571): event from contract 327: process 3578 received a fatal signal
         signal: 9 (SIGKILL)
         sender pid: 3042
         sender ctid: 257
ctrun(3571): fatal "signal" event from contract 327
ctrun(3571): event from contract 327: contract empty
ctrun(3571): failure in contract 327, restarting command
ctrun(3571): created contract id 328

There is a distinction which the contract framework makes, which does 
not matter to me.  SIGKILL is fatal, but SIGTERM is not.  I as a user 
don't really care, the end result is the same to me, pids in the 
contract eventually all exit.  Why is this?  Why this distinction, I mean.

And why won't ctrun restart for me on the critical event "empty"?

CT

Reply via email to