Re: Service stopping in prerm considered harmful
Pierre THIERRY schrieb am Sunday, den 23. March 2008:
> For the nth time, I have a package that dpkg is unable to remove because
> it tries to stop a service that either is already stopped (I didn't want
> it) or couldn't start at all. In the former case, the fix seems simple:
> start the service and remove the package. But sometimes starting the
> service may have undesirable outcomes on the system, or the stop action
> will fail in some way.
>
> In either case, when you can't get a successful stop action for the
> service init.d script, the package is impossible to remove without human
> action, and not a simple one, because you need to be able to hack the
> maintainer scripts or the init.d script.
>
> Shouldn't the maintainer script actually ensure that the service is not
> running, instead of just triggering the stop action and checking its
> exit code? Something like (it's pseudo-code, because the status action
> of init.d scripts prints text, it doesn't seem to give machine-friendly
> data):
>
> ------------------------------------------------------------------------
> # if it's running, stop it
> if(status(service) == running) {
> stop(service);
> }
> # if now it's still running, something's wrong
> if(status(service) == running) {
> exit 1;
> }
> # proceed...
> ------------------------------------------------------------------------
There is a small trick with dh_installinit that can be used. dh_installinit
supports an errorhandler. If called like:
dh_installinit -i --error-handler=init_failed --init-script=amavis -- defaults 19 21
it generates the following debhelper code for prerm and postinst:
...
invoke-rc.d amavis stop || init_failed
All you need then is a small function like in your postinst:
init_failed ()
{
echo "WARNING: Starting amavisd-new failed. Please check your
configuration."
}
This works fine for me and removes the annoying default behaviour of
dh_installinit.
Alex
Reply to: