10.01.2011 22:49, Marius Tolzmann wrote:

hi..

[Unit]
Description=Lighttpd Web Server
After=network.target

[Service]
Type=forking
EnvironmentFile=/etc/conf.d/lighttpd
PIDFile=/var/run/lighttpd.pid
ExecStartPre=/usr/sbin/lighttpd -t -f /etc/lighttpd/lighttpd.conf
ExecStart=/usr/sbin/lighttpd -f /etc/lighttpd/lighttpd.conf
ExecStop=/bin/kill -INT $MAINPID
ExecReload=/usr/sbin/lighttpd -t -f /etc/lighttpd/lighttpd.conf
ExecReload=/bin/kill -INT $MAINPID
ExecReload=/bin/sleep 1
ExecReload=/usr/sbin/lighttpd -f /etc/lighttpd/lighttpd.conf
StandardOutput=syslog
StandardError=syslog

i still try to get behind all the systemd magic so i have some questions on this unit:

can the initial problem of restarting the lighttpd gracefully be solved by something like this?:

[Unit]
..
ConditionPathExists=/etc/lighttpd/lighttpd.conf

[Service]
ExecStartPre=/usr/sbin/lighttpd -t ...
ExecStart=/usr/sbin/lighttpd ...
ExecStop=/bin/kill -INT $MAINPID
ExecReload=/usr/sbin/lighttpd -t ...
ExecReload=/bin/kill -INT $MAINPID
StandardOutput=syslog
Restart=on-success ( or on-abort or always .. don't know what the
                     exit-status after graceful kill is in lighty)

No, the Restart logic in systemd is not right for lighttpd (or rather: the logic required by lighttpd is insane). Systemd will start a new instance of lighttpd as soon as the main PID (i.e., in the default setup with server.max-worker = 1, the only PID) of the old instance exits, which is too late. I want the old and the new instances of lighttpd to coexist for some time. See: after SIGINT, the old instance does not listen on port 80, but continues servicing large downloads that are still in progress. The new instance accepts new connections and handles them. The old instance will exit as soon as all old transfers ard completed.


and why do you explicitly not use the -D option and let systemd do all the forking stuff for you..? you could get rid off the Type= PIDFile= lines..

This would indeed work if I didn't need the funky graceful restart logic.

i also removed StandardError=syslog which seems to be redundant here..

OK. If you want to see what went into Gentoo systemd overlay, look here: http://git.overlays.gentoo.org/gitweb/?p=user/systemd.git;a=commitdiff;h=d34961cf8be3743013d026c21ca64078ad0f1255 . Essentially, I gave up, but documented the effort.

SignalStop=SIGINT and SignalReload=SIGINT or something similar may be a nice shortcut for doing those kind of things.. Since SignalReload=SIGHUP seems to be a way how it is done most of the time?

Yes, this would be a good shortcut.


Another question: Doesn't the default KillMode=control-group would send a SIGTERM to the remaining processes of this service immediately after the ExecStop= returns and so break the idea behind a graceful shutdown where the main-process exits and all running http-requests will be finished? (Or is there also a delay of TimeoutSec= between ExecStop= and the first SIGTERM?)

The documentation (man systemd.service, search for TimeoutSec) says it waits.

Anyway, lighttpd is very easy to set up, the default config works fine for static files, and the only possible trouble is avoided by commenting out the server.use-ipv6 = "enable" line, so you may want to play with it yourself. To experiment with graceful restarts, you can put some music in the document root and attempt to download it with wget -O /dev/null --limit-rate=20k http://127.0.0.1/file.mp3 while restarting lighttpd.

--
Alexander E. Patrakov
_______________________________________________
systemd-devel mailing list
systemd-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/systemd-devel

Reply via email to