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