일반적으로 여기에 게시하지 않지만이 머리카락 위로 머리카락을 찢어냅니다. 나는 시작할 때 포크하고 다른 많은 프로세스를 시작하는 Python 스크립트를 가지고 있습니다. 이 스크립트는 sysvinit를 통해 시작할 때 시작되었지만 최근에는 데비안 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
편집 : 파이썬 스크립트가 본질적으로 자식 프로세스의 '제어기'라는 것을 지적하는 것이 관련이 있습니다. 중앙 서버에서 요청한대로 gnu 화면에서 서버를 시작 및 중지합니다. 일반적으로 항상 실행되며 서비스를 생성하고 종료하지 않습니다. 그러나 프로세스가 pid 1로 분리되어 있음에도 불구하고 자식 프로세스를 종료하지 않고 스크립트를 다시로드 할 수있는 경우가 있습니다. 실제로 Python 스크립트가 프로세스를 시작했는지 여부는 중요하지 않습니다. 가능하다면 부모 프로세스.
작동 방식에 대한 더 나은 설명 :
- 시스템 스폰 /Server.py
- Server.py는 Systemd의 pid 파일을 포크하고 씁니다.
- 그런 다음 Server.py는 지침에 따라 서버 화면에서 서버 프로세스를 생성합니다.
- 서버에서 요청한 다시 시작을 수행하기 위해 Server.py가 계속 실행됩니다.
Systemd없이 시작하면 Server.py를 다시 시작할 수 있으며 시작하는 gnu 화면에는 영향을 미치지 않습니다. Systemd로 시작할 때 Server.py가 종료되면 pid 1로 분리 된 화면 프로세스 대신 종료됩니다.
simple
또는 forking
실제로는), 최후의 수단이 될 것이다 Type=oneshot
, RemainAfterExit=yes
하고 KillMode=control-group
.
Server.py
시작된 서비스 포크 (포크 된 경우)를 수행하는 방법에 대한 설명과 코드 없이 솔루션을 제공하기가 어렵습니다 . 그러나 일반적으로, 이것은 준비 프로토콜 불일치 문제입니다.