Nie zamieszczaj tutaj normalnie, ale odrywam włosy od tego. Mam skrypt w języku Python, który uruchamia się podczas uruchamiania i jest odpowiedzialny za uruchomienie szeregu innych procesów. Ten skrypt był uruchamiany przy starcie przez sysvinit, ale ostatnio uaktualniłem do Debian Jessie, więc dostosowałem go do uruchamiania przez systemd.
Niestety mam problem, którego nie mogę rozwiązać. Po uruchomieniu skryptu bezpośrednio w powłoce użytkownika uruchamia on poprawnie procesy potomne, a gdy skrypt się kończy, procesy potomne są osierocone i kontynuują działanie.
Po uruchomieniu przez systemd, jeśli proces nadrzędny kończy działanie, wszystkie dzieci również wychodzą (cóż, ekran, który uruchamiają w die i pojawiają się jako Dead ???)
Idealnie powinienem móc zrestartować skrypt nadrzędny bez zabijania wszystkich procesów potomnych, czy jest coś, czego mi brakuje?
Dzięki!
[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
Edycja: Prawdopodobnie warto wskazać, że skrypt Pythona jest zasadniczo „kontrolerem” procesów potomnych. Uruchamia i zatrzymuje serwery na ekranach GNU zgodnie z żądaniem serwera centralnego. Zwykle zawsze działa, nie odradza usług i nie wychodzi. Są jednak przypadki, w których chciałbym móc ponownie załadować skrypt bez zabijania procesów potomnych, nawet jeśli oznacza to, że procesy są osierocone do pid 1. W rzeczywistości nie ma znaczenia, czy skrypt Pythona uruchamia procesy jako proces nadrzędny, jeśli jest to w ogóle możliwe.
Lepsze wyjaśnienie, jak to działa:
- Systemd spawn /Server.py
- Server.py rozwidla i zapisuje plik pid dla Systemd
- Server.py następnie spawnuje procesy serwera na ekranie GNU zgodnie z jego instrukcjami
- Server.py nadal działa, aby wykonać wszelkie restarty wymagane od serwera
Podczas uruchamiania bez Systemd Server.py można zrestartować, a uruchomione przez niego ekrany GNU pozostają nienaruszone. Podczas uruchamiania za pomocą Systemd, gdy Server.py zamyka się, zamiast procesów ekranowych osieroconych do pid 1, zostają zabici.
simple
lub forking
faktycznie), ostatecznością byłoby Type=oneshot
, RemainAfterExit=yes
i KillMode=control-group
.
Server.py
kodu i opisu, jak rozwidlają się uruchomione usługi (jeśli rozwidlają). Jednak ogólnie rzecz biorąc, jest to problem niedopasowania protokołu gotowości .