Как я и предположил ранее, после внесения изменений в процесс демонизации sopdsd.py все стало нормально работать при запуске юнитом systemd. Для этого надо убрать первый форк и отвязку от родительского окружения. По быстрому делаем так:***
В файле sopdsd.py удаляем все строки между
"""
Deamonize, do double-fork magic.
"""
и
# Do second fork (SCAN DAEMON)
Создаем /etc/systemd/system/sopds.service в котором:
[Unit]
Description=Simple OPDS
After=network.target
Requires=mysql.service
[Service]
User=ИМЯ_ПОЛЬЗОВАТЕЛЯ_ОТ_КОТОРОГО_СТАРТУЕТ_ДЕМОН
ExecStart=/opt/sopds/py/sopdsd.py start
Type=forking
PIDFile=/tmp/sopds-http.pid
ExecStop=/opt/sopds/py/sopdsd.py stop
RestartSec=300
Restart=always
[Install]
WantedBy=multi-user.target
Если sopds будет убит любым способом кроме systemctl stop sopds, то через время в секундах, заданное в RestartSec, он будет перезапущен. Для проверки можно убить его:
systemctl kill -s HUP --kill-who=main sopds.service
, посмотреть статус сразу после этого и еще раз по прошествии RestartSec.
*** По хорошему, надо просить mitshel добавить возможность запуска sopdsd.py со специальным ключом, который позволит пропустить эту часть кода. Мои познания в питоне равны 0 и я это сделать не могу.
Наслаждаемся неубиваемым sopds!
PS Еще хочу разобраться как запускать unit в пространстве очень ограниченной file system namespace, чтобы видимый из интернета демон не мог вообще ничего сделать с остальной системой. Пока ограничил его запуском от пользователя без шелла (/bin/false).