It seems to me tha the problem is there are two states and three cases: 1) administrative disablement because of administrator preference 2) "maintenance" because of a correctable error (s/w or h/w config, dependency problems) 3) "can't run" because a required h/w or condition is not present (not right platform, absence of device, absence of particular bus technology, etc.)
1 maps to 'disabled', 2 maps to 'maintenance', but 3 really is a different case. There's no purely-administrative action that can resolve it like most 'maintenance' states, but it's not an arbitrary rescindable policy decision either. David Bustos wrote: > Quoth Michael Shapiro on Sat, Nov 25, 2006 at 01:16:23PM -0800: >>> Quoth Cathy Thomas on Fri, Nov 17, 2006 at 12:58:50PM -0800: >>>> My service (ipmievd) will not run if the local host does not have >>>> a BMC device available. ipmievd itself will return a 1 and give an >>>> error message that "no BMC is available". >>> ... >>> >>> You currently have three options: >>> >>> 1. The start method detects that the BMC is unavailable (either by >>> itself or through the daemon) and reports a fatal error to SMF. >>> The service ends up in the maintenance state. >>> >>> 2. The start method detects that the BMC is unavailable and disables >>> the service. The service ends up in the disabled state. >>> >>> 3. Even though the daemon detects that there is no BMC device, it >>> stays running, presumably doing nothing. The start method reports >>> success and the sevice enters and stays "online". > ... >> In terms of the daemon, I think the only sensible behavior is (2). (1) >> doesn't >> make sense because there's nothing broken -- i.e. nothing for someone to >> repair. (3) might make sense for some daemons, but not this one, because >> fundamentally if there is no BMC it means the platform has none -- this isn't >> a DR'able resource, and thus you're just wasting CPU + memory. Plus ipmievd >> being a bunch of open source, it likely just fails or exits if BMC is >> missing. > > I think that to most users, services disabling themselves would be > confusing. I think that once a user encountered such a service, he > would be more likely to think that he misspelled the FMRI or that > svcadm is broken than to run svcs -x on it or guess that the service is > disabling itself. And if he did learn what was going on, I think it's > likely that it would plant a seed of mistrust: "If a service can disable > itself when I try to enable it, what's keeping any service from > disabling itself at any time? Or any other software from disabling any > service? Do I have to keep a list of the services that I want enabled > and check them each minute?" > > Certainly, I don't think it's appropriate for self-disablement to become > a best-practice without svcs -x being able to explain what happened, > svcadm enable -s failing in that case, and a campaign to change the > documentation to explain that "disabled" means "not running either > because you didn't want it to or because the system didn't think it was > appropriate -- use svcs -x to distinguish". I suppose "svcs" > differentiating temporarily-disabled services from persistently-disabled > services in the default listing would help, too. But I'd rather us not > require users to have to keep this in mind whenever they enable services > and instead have the service go into "maintenance", for which we train > people to run svcs -x. Your argument that "(1) doesn't make sense > because there's nothing broken" is wrong -- the administrator asked for > a service which the hardware cannot provide. That sounds broken to me. > > Now if we did advise service authors to put their service into > maintenance if the hardware can't support the service, there is the > question of what to do when the hardware can change frequently -- > apparently like Xen. The administrator might want a service to be > "enabled only when the hardware is right". Putting the service in > maintenance otherwise wouldn't really be appropriate. A solution to > this isn't clear to me. On the one hand, Enhanced SMF Profiles would > allow the desired behavior at platform granularity, since it will allow > the system to reselect the appropriate platform profile on each boot. > But it seems that developers want finer granularity -- down to the > device, as you suggested with /dev dependencies. That's appealing > except that it would result in those services being in "offline", which > we usually consider a problematic state. We could allow the developer > to flag the dependency as disable-if-unsatisfied, as John suggested, but > I don't know, seems weird to me. > > > David