[systemd-devel] Problems trying to convert a System-V-Init script to systemd
Holger Kiehl
Holger.Kiehl at dwd.de
Fri Jul 15 10:28:08 UTC 2016
On Thu, 14 Jul 2016, Andrei Borzenkov wrote:
> 14.07.2016 15:34, Holger Kiehl пишет:
> > Hello,
> >
> > I am new to systemd and the maintainer of the file distribution software
> > AFD (http://www.dwd.de/AFD) and I am trying to adapt this application
> > to systemd. The problem I am unable to solve is that doing a reboot,
> > poweroff or halt, all process get a SIGTERM before systemd calls the
> > command supplied by ExecStop. If I do a 'systemctl stop afd.service'
> > everything works as expected. I have searched the web for a solution
> > and have tried all the different service Type=, unit After=/Before=
> > combination, but failed so far. I must be doing something obviously
> > wrong, but unable to see what and need help please.
> >
> > The service/unit file looks as follows:
> >
> > [Unit]
> > Description=Automatic File Distributor
> > After=basic.target
> >
>
> This is redundant - it is default for any standard service
>
> > [Service]
> > RemainAfterExit=yes
> > Type=oneshot
>
> That's wrong (although it is unrelated to the problem you have). It
> means systemd expects ExecStart to run and finish. In your case it
> appears to work because you use RemainAfterExit, but if you look more
> closely, your service is in state where PID is exited.
>
> > ExecStart=-/etc/init.d/afd start
> > ExecStop=-/etc/init.d/afd stop
> > KillMode=none
>
> Well, in this case you rely on your service to behave well. You must be
> very confident :)
>
> > StandardOutput=syslog+console
> > StandardError=syslog+console
> >
> > [Install]
> > WantedBy=multi-user.target
> >
> > /etc/init.d/afd is a shell script that starts one or more instances of
>
> If you start multiple instances, you should consider service template so
> each instance can be represented as exactly one systemd service.
>
> > the AFD under different users. The users are configured in /etc/sysconfig/afd
> > and are started via the following command: su - $afduser -c "<cmd start/sop AFD>"
>
> so what most likely happens, is - su establishes new login session; on
> shutdown these sessions are cleaned up (concurrently with any running
> service - unfortunately, there is no way to express dependency between
> user and system systemd instances). Here is where you get your signals.
>
> Check with loginctl after service is started - do you see and extra seesion?
>
> > To speed things up a bit the script forks for each user to start/stop the
> > AFD instances. The script /etc/init.d/afd is just initiating thinks, but
> > always waits for the command to complete. AFD itself has an init process
> > (init_afd) that then starts several other process and monitors them.
> >
> > In /etc/init.d/afd I have added the following line in the beginning, before
> > it wants to do the shutdown:
> >
> > echo "Before: ps -u afd: `ps -u $afduser`" >> /var/log/afd.log
> >
> > And this then shows the following:
> >
> > Before: ps -u afd: PID TTY TIME CMD
> > 1258 ? 00:00:00 init_afd
> > 1260 ? 00:00:00 system_log <defunct>
> > 1261 ? 00:00:00 event_log <defunct>
> > 1262 ? 00:00:00 receive_log <defunct>
> > 1263 ? 00:00:00 transfer_log <defunct>
> > 1264 ? 00:00:00 trans_db_log <defunct>
> > 1265 ? 00:00:00 archive_watch <defunct>
> > 1266 ? 00:00:00 input_log <defunct>
> > 1267 ? 00:00:00 output_log <defunct>
> > 1268 ? 00:00:00 delete_log <defunct>
> > 1269 ? 00:00:00 production_log <defunct>
> > 1270 ? 00:00:00 distribution_lo <defunct>
> > 1271 ? 00:00:00 amg <defunct>
> > 1272 ? 00:00:00 aldad <defunct>
> > 1287 ? 00:00:00 afd_stat <defunct>
> > 1288 ? 00:00:00 fd <defunct>
> > 1289 ? 00:00:00 dir_check <defunct>
> >
> > All the process have received a SIGTERM before (or during the execution)
> > of the script.
> >
> > Any idea what I am doing wrong,
>
> Much :)
>
> > or what else I can try to do a proper
> > shutdown of this application under systemd?
> >
>
> Use native systemd unit, do not use init scripts. Use User= to
> impersonate user, use Type=forking and PIDFile= to proper synchronize
> service startup, use templates to run multiple instances.
>
First thank you very much for your very clear and good explaination.
I tried to avoid Type=forking and PIDFile= because I then have to maintain
two different init versions, systemd and System-V-Init. I think there will
always be other Unix systems around without systemd and I do not want to
loose those users.
Would it help if I build into my script for each instant it starts
it calls systemd-notify with --pid=<init_afd pid of the user>? But if
I understand you correctly this too would not help because of the 'su -'.
Correct?
Regards,
Holger
More information about the systemd-devel
mailing list