Зазвичай не публікуйте тут, але я розриваю волосся над цим. У мене є скрипт Python, який розщеплюється під час його запуску і відповідає за запуск ряду інших процесів. Цей сценарій запускався при запуску через sysvinit, але нещодавно я перейшов до Debian Jessie, тому адаптував його до запуску через systemd.
На жаль, я стикаюся з проблемою, яку я не можу вирішити. Коли ви запускаєте скрипт безпосередньо в оболонці користувача, він запускає його дочірні процеси правильно, а коли сценарій закінчується, дочірні процеси осиротіли і продовжують працювати.
Коли запускається Via systemd, якщо вихідний процес закінчується, діти теж виходять (ну, екран, який вони запускають у мертвій формі і виглядають як мертвий ???)
В ідеалі мені потрібно мати можливість перезапустити батьківський сценарій, не вбиваючи всіх дочірніх процесів, чи є щось, чого я пропускаю?
Спасибі!
[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 запустив процеси, як батьківський процес, якщо це навіть можливо.
Краще пояснення, як це працює:
- Системні нерести /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
коду та опису того, як розгортаються запущені служби (якщо вони розщеплюються). Однак, загалом кажучи, це проблема невідповідності протоколу готовності .