[systemd-devel] Problems trying to convert a System-V-Init script to systemd

Holger Kiehl Holger.Kiehl at dwd.de
Thu Jul 14 12:34:21 UTC 2016


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

   [Service]
   RemainAfterExit=yes
   Type=oneshot
   ExecStart=-/etc/init.d/afd start
   ExecStop=-/etc/init.d/afd stop
   KillMode=none
   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
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>"
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, or what else I can try to do a proper
shutdown of this application under systemd?

Thanks in advance,
Holger


More information about the systemd-devel mailing list