<div dir="ltr">Have you looked into  using sd_notify to update MAINPID?<br></div><div class="gmail_extra"><br clear="all"><div><div dir="ltr"><div><br></div>--<br>Кирилл Елагин</div></div>
<br><br><div class="gmail_quote">On Mon, May 5, 2014 at 1:19 AM, Gerd v. Egidy <span dir="ltr"><<a href="mailto:lists@egidy.de" target="_blank">lists@egidy.de</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

Hi,<br>
<br>
I'm one of the developers of the Icinga monitoring system. We want to provide<br>
a .service file for our monitoring daemon with the next major release (Icinga<br>
2).<br>
<br>
Due to technical reasons, the daemon can't reload it's configuration files<br>
within one process. So we implement reload like this:<br>
<br>
1. daemon process detects a SIGHUP or reload request on a control channel<br>
2. a new process is forked & execed with a special commandline argument<br>
indicating a reload<br>
3. the old daemon continues it's normal work<br>
4. the new process loads and checks the configuration (this can be time<br>
consuming)<br>
5. a) on config errors the new process terminates. the old daemon detects the<br>
SIGCHLD, logs error messages and so on<br>
5. b) when the config is ok the new process sends a SIGTERM to the old daemon<br>
6. the old daemon shuts down due to the SIGTERM<br>
7. the new process detects when the old daemon is gone, activates it's config<br>
and starts it's work<br>
<br>
This is much better than a regular restart:<br>
a) the time consuming config check is done in background<br>
b) service is not interrupted if the new config is invalid<br>
<br>
But this scheme seems not to work well with systemd: After reload systemd<br>
thinks the daemon has ended and declares the whole service "inactive (dead)",<br>
usually killing the remaining daemon.<br>
<br>
After diving into the systemd manpages and trying some options, I found that I<br>
could make it work with GuessMainPID=no:<br>
<br>
[Unit]<br>
Description=Icinga host/service/network monitoring system<br>
After=syslog.target postgresql.service mariadb.service<br>
<br>
[Service]<br>
Type=forking<br>
EnvironmentFile=/etc/sysconfig/icinga2<br>
ExecStart=/usr/sbin/icinga2 -c ${ICINGA2_CONFIG_FILE} -d -e<br>
${ICINGA2_ERROR_LOG} -u ${ICINGA2_USER} -g ${ICINGA2_GROUP}<br>
ExecReload=/bin/sh -c '/bin/kill -HUP `cat<br>
${ICINGA2_STATE_DIR}/run/icinga2/icinga2.pid`'<br>
GuessMainPID=no<br>
<br>
[Install]<br>
WantedBy=multi-user.target<br>
<br>
Systemd seems to successfully detect the daemon pids and some short tests with<br>
systemd-208-16.fc20.x86_64 were successful. But I'm not sure about the<br>
downsides of GuessMainPID=no or if there are some problems with older versions<br>
of systemd or if future changes in systemd will pose problems.<br>
<br>
Can you describe the downsides of GuessMainPID=no more specific than "failure<br>
detection and automatic restarting of a service will not work reliably"?<br>
<br>
Can you recommend a better alternative for the reload scheme outlined above?<br>
<br>
I'd prefer if I could tell systemd about the pidfile. Systemd should then<br>
either automatically detect updates of the pidfile (e.g. via inotify) or at<br>
least re-read it if it thinks the service has changed state.<br>
<br>
Kind regards,<br>
<br>
Gerd<br>
<br>
_______________________________________________<br>
systemd-devel mailing list<br>
<a href="mailto:systemd-devel@lists.freedesktop.org">systemd-devel@lists.freedesktop.org</a><br>
<a href="http://lists.freedesktop.org/mailman/listinfo/systemd-devel" target="_blank">http://lists.freedesktop.org/mailman/listinfo/systemd-devel</a><br>
</blockquote></div><br></div>