[systemd-devel] restart vs. stop/start
Christian Boltz
systemd-devel at cboltz.de
Sun May 22 14:18:53 UTC 2016
Hello,
Am Samstag, 21. Mai 2016, 10:31:22 CEST schrieb Andrei Borzenkov:
> 21.05.2016 05:59, Reindl Harald пишет:
> > Am 20.05.2016 um 21:50 schrieb Christian Boltz:
> >> systemctl restart foo
> >>
> >> is internally mapped to a sequence of
> >>
> >> systemctl stop foo; systemctl start foo
> >
> > what else?
It's a good default, but like every default, there are cases where you
need something different ;-)
> >> Unfortunately, this behaviour causes quite some trouble for me.
> >
> > why?
>
> If you bothered to read URL OP mentioned, you would see one possible
> reason.
I can add my usecase as another reason ;-)
I'm talking about AppArmor, where "stop" means unloading the profiles
from the kernel. The result is that all AppArmor confinement is removed
from all running processes.
"start" means loading the profiles and applying the confinement to _newly
started_ profiles.
This also means that _already running_ processes won't be (re)confined [1],
which translates a small typo done by the admin ("systemctl restart
apparmor" instead of "systemctl reload apparmor") to leaving lots of
processes unconfined and turns that accidential use of "restart" into a
security risk.
This is why I need to override the "restart" behaviour so that it
reloads the profiles while keeping running processes confined.
The easiest solution would be an ExecRestart= directive in the service
file, but unfortunately this isn't available.
Actually, searching for "systemd ExecRestart" brings up that I'm not
the first one asking for it, see for example
https://lists.freedesktop.org/archives/systemd-devel/2012-November/007595.html
and https://techdetails.agwego.com/2013/06/07/227/
A possible alternative would be to use
ExecStop=echo "broken by systemd. If you really want to stop AppArmor, please use $newly_invented_command"
I'd really like to avoid this ;-) but it's probably better than silently
making the system insecure by an accidently typed "restart".
> >> I need a way to know if "restart "or "stop" was used because the
> >> mapping to stop / start gives my service a completely different
> >> behaviour than expected on restart.
> >>
> >> Is there a way to find out if "stop" or "restart" was used?
> >
> > if you need to differ here your service is broken by design - why do
s/broken by design/different/ - or s/your service/systemd/ (choose yourself!)
Please don't judge on something that hard just because it doesn't work
the way you expect ;-)
> > you need to kow what triggered stop and what else do you imagine
> > for "restart" then stop-start?
See above.
> I am curious how you implement "systemctl daemon-restart" using only
> plain "stop systemd" followed by "start systemd".
Yeah, good question. I'm also interested in the answer ;-)
Regards,
Christian Boltz
[1] According to the AppArmor developers, changing this behaviour in
the kernel so that already running applications get (re)confined is
close to impossible due to various reasons.
Details on request, but I know them (and AppArmor) good enough to
believe in this statement.
--
* cboltz wonders if jjohansen already regrets
calling me "a devs walking nightmare"
<jjohansen> cboltz: no it still fits :P
[from #apparmor]
More information about the systemd-devel
mailing list