Обычно не пишите здесь, но я вырываю свои волосы из-за этого. У меня есть скрипт Python, который разветвляется при запуске и отвечает за запуск нескольких других процессов. Этот скрипт запускался при запуске через sysvinit, но недавно я обновился до Debian Jessie, поэтому адаптировал его для запуска через systemd.
К сожалению, я сталкиваюсь с проблемой, которую не могу решить. Когда вы запускаете сценарий непосредственно в пользовательской оболочке, он правильно запускает свои дочерние процессы, а при выходе из сценария дочерние процессы становятся сиротами и продолжают выполняться.
Когда запускается через systemd, если родительский процесс завершается, все дети тоже выходят (ну, экраны, которые они запускают в die и выглядят как Dead ???)
В идеале мне нужно иметь возможность перезапустить родительский скрипт, не убивая все дочерние процессы, есть что-то, чего мне не хватает?
Благодарность!
[Unit]
Description=Server commander
After=network.target
[Service]
User=serveruser
Type=forking
PIDFile=/var/Server/Server.pid
ExecStart=/var/Server/Server.py
ExecStop=/bin/kill -s TERM $MAINPID
[Install]
WantedBy=multi-user.target
Редактировать: Вероятно, для меня важно указать, что скрипт Python по сути является «контроллером» для своих дочерних процессов. Запускает и останавливает серверы на экранах GNU в соответствии с запросом от центрального сервера. Обычно он всегда работает, он не порождает сервисы и не завершает работу. Однако есть случаи, когда я хотел бы иметь возможность перезагрузить скрипт, не убивая дочерние процессы, даже если это означает, что процессы теряют связь с pid 1. На самом деле, даже не имеет значения, если скрипт Python запускает процессы как родительский процесс, если это вообще возможно.
Лучшее объяснение того, как это работает:
- Systemd порождает /Server.py
- Server.py разветвляется и записывает pid-файл для Systemd
- Затем Server.py порождает процессы сервера в окне GNU в соответствии с его инструкциями
- Server.py продолжает работать, чтобы выполнить любые перезапуски, запрошенные с сервера
При запуске без Systemd Server.py может быть перезапущен, и экраны gnu, которые он запускает, не затрагиваются. При запуске с Systemd, когда Server.py завершает работу, вместо тех экранных процессов, которые отключены от pid 1, они уничтожаются.
simple
или forking
, собственно), последним средством будет Type=oneshot
, RemainAfterExit=yes
и KillMode=control-group
.
Server.py
кода и описания того, как запускаются запущенные сервисы (если они работают). Однако, вообще говоря, это проблема несоответствия протокола готовности .