[systemd-devel] [Netatalk-admins] Restart=always and "ExecStartPre" (netatalk)
HAT
hat at fa2.so-net.ne.jp
Thu Sep 29 08:15:46 PDT 2011
Hi, I'm a member of netatalk-admins ML.
I'm subscribing to systemd-devel ML temporarily.
and I'm going to unsubscribe when this problem is solved.
I added an "--enable-redhat-systemd" option to netatalk 2.2.1.
This implementation is a copy of netatalk.service and netatalk.sh in
netatalk-2.2.0-4.fc17.src.rpm because I don't have the knowledge of systemd.
<http://koji.fedoraproject.org/koji/buildinfo?buildID=259507>
This message is sent also to rpm packager.
If someone offers more suitable patch, I will apply it to netatalk 2.2.2.
>[root at testserver:~]$ cat /lib/systemd/system/netatalk.service
>[Unit]
>Description=Apple-File-Server
>After=syslog.target network.target avahi-daemon.service
>[Service]
>Type=forking
>PIDFile=/var/run/netatalk.pid
>ExecStartPre=/usr/sbin/cnid_metad -l log_note
>ExecStart=/usr/sbin/afpd -P /var/run/netatalk.pid -F /etc/netatalk/afpd.conf
>Restart=always
>RestartSec=1
>[Install]
>WantedBy=multi-user.target
This method is inapplicable to netatalk 2.2.2.
Netatalk have afpd, cnid_metad, atalkd, papd, timelord and a2boot daemons.
Systemd MUST control all daemons.
For the moment, "/etc/netatalk/netatalk.conf" must be read because
the following parameters cannot be set in "/etc/netatalk/afpd.conf".
ATALK_UNIX_CHARSET=
ATALK_MAC_CHARSET=
AFPD_MAX_CLIENTS=
CNID_CONFIG=
I think these parameters should be abolished in the future (netatalk 3.0?).
But it is impossible in current netatalk 2.2.x.
In case of netatalk 2.2.1,
a shell-script "/usr/libexec/netatalk/netatalk.sh" calls netatalk.conf.
Is there any method of otherwise reading netatalk.conf?
IMHO, a better method is that passing options to netatalk.sh.
ExecStart=/bin/sh -c "exec /usr/libexec/netatalk/netatalk.sh start"
ExecStop=/bin/sh -c "exec /usr/libexec/netatalk/netatalk.sh stop"
ExecRestart=/bin/sh -c "exec /usr/libexec/netatalk/netatalk.sh restart"
Is a method of using shell-script unsuitable?
> thank you for your reply
>
> first i tried two services (netatalk.service + netatalk-cnid.service)
> but for whatever reason /usr/sbin/cnid_metad will be started with
> a correct zero-return-value but the process is closed, tried preforking/simple
>
> the other "problem" is that i want take away complexity for start/restart
> at the user/admin-level there should be only used "netatalk.service"
> this works fine with Requires= for the first start, but not when stop
> netatalk.service in a way that netatalk-cnid.service is stopped also
>
> background-informations:
> afpd: the apple fileserver
> cnid_meta: a shared service for the AppleDB
>
> upstream has included a systemd option in netatalk-2.2.1-p1 but
> the created systemd-service does not satisfy me because it is a
> shellscript reading/defining some shell-vars and starting both
> processes as "oneshot" with "RemainAfter" wthat means that
> "Restart" is generally not possible and even if you kill both
> processes "systemctl status" says "running", so this is a wrapper
> which is faking a systend-service without any benefit
>
> a copy of my reply goes ot the netatalk-mailing-list
> maybe they could optimize this upstream and provide the
> service file as textfiel in the tarball instead generate
> it with the configure-options to make custom builds easier
>
> however, the fileserver is an internal service but i would love to use the
> restart-options and install a cron-script parsing /var/log/messages for
> systemd-restart-events to send mail-notifies
>
> Retart=always is one of the few current available improvements of systemd
> over the old sysvinit to make even rock solid services more stable by
> restart them at the few crashes instead fireup a alarm-mail
>
> thanks!
>
>
> Am 28.09.2011 22:48, schrieb Michal Schmidt:
>> On Wed, 28 Sep 2011 17:49:54 +0200 Reindl Harald wrote:
>>> why does systemd not restart a killed service if the
>>> "ExecStartPre"-process is still running, see below - at my opinion
>>> after "killall afpd" the service should be restarted and in a perfect
>>> case even if "ExecStartPre"-process dies
>>>
>>> systemd-26-10.fc15.x86_64
>>
>> I see at least three issues here. See below.
>>
>>> [root at testserver:~]$ cat /lib/systemd/system/netatalk.service
>>> [Unit]
>>> Description=Apple-File-Server
>>> After=syslog.target network.target avahi-daemon.service
>>> [Service]
>>> Type=forking
>>> PIDFile=/var/run/netatalk.pid
>>> ExecStartPre=/usr/sbin/cnid_metad -l log_note
>>
>> issue #1:
>> ExecStartPre is not supposed to fork off daemons. A future version of
>> systemd might even enforce this rule. The service should be split into
>> two.
>>
>>> ...
>>> [root at testserver:~]$ systemctl status netatalk.service
>>> netatalk.service - Apple-File-Server
>>> Loaded: loaded (/lib/systemd/system/netatalk.service)
>>> Active: active (running) since Wed, 28 Sep 2011 17:45:55
>>> ...
>>> Main PID: 1812 (code=exited, status=0/SUCCESS)
>>
>> issue #2:
>> This Main PID looks like stale information from a previous run of the
>> service. This is a minor bug in systemd that it does not reset it.
>>
>> There are two reasons why systemd failed to detect the new main PID:
>> - issue #3: afpd has a racy daemonization sequence. It writes its PID
>> file too late. My recently proposed patch "service: delayed main PID
>> guessing" should be able to workaround it.
>> - Given that systemd could not read the information from the PID file,
>> it tried to guess the main PID, but it also failed, because there
>> are two top-level processes in the cgroup:
>>
>>> CGroup: name=systemd:/system/netatalk.service
>>> ├ 1999 /usr/sbin/cnid_metad -l log_note
>>> └ 2002 /usr/sbin/afpd -P /var/run/netatalk.pid -F /etc/netatalk/afpd.conf
>>
>> systemd could tell which one of them is the main PID.
>>
>> When the main PID is not known, the only way to detect the death of the
>> service is to watch for the cgroup getting empty.
>>
>> Michal
--
HAT
More information about the systemd-devel
mailing list