태그 보관물: systemd

systemd

시스템 및 프로세스 스폰 프로세스를 시작하는 Python 스크립트를 가지고 있습니다. 이

일반적으로 여기에 게시하지 않지만이 머리카락 위로 머리카락을 찢어냅니다. 나는 시작할 때 포크하고 다른 많은 프로세스를 시작하는 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로 분리 된 화면 프로세스 대신 종료됩니다.



답변

컨트롤 그룹 대신 기본적으로 KillMode를 처리하도록 설정 하여이 문제를 해결했습니다. 모두 감사합니다


답변

나는 시작할 때 포크하고 다른 많은 프로세스를 시작하는 Python 스크립트를 가지고 있습니다.

잘못하고 있음을 나타냅니다. 이것에 더 많은 순간이 있습니다.

스크립트가 종료되면 하위 프로세스가 분리되어 계속 실행됩니다.

이것은 올바른 행동이 아닙니다. “주요”프로세스 (이 경우 포크 한 하위 프로세스를 지정한 이후)가 Type=forking종료되면 systemd는 서비스가 비활성화 된 것으로 간주하고 정리 그룹을 위해 아직 실행중인 다른 프로세스 (제어 그룹)를 종료합니다. .

rcsystemd 스크립트에서 systemd로 변환하는 것은 간단하지 않습니다. systemd에서 작업을 수행하는 올바른 방법이 상당히 다르기 때문입니다. systemd에서 OpenVPN, OpenStack 또는 OSSEC HIDS를 수행하는 올바른 방법은 rc스크립트를 사용하는 것과 동일하지 않습니다 . 포크하는 스크립트가 있고 손자 프로세스의 전체 부하를 생성 한 다음 손자가 계속 실행될 것으로 기대한다는 사실은 ossec-control두 가지 수준의 포크는 없지만 똑같은 공포를 겪고 있음을 나타냅니다 . “활성화”플래그를 확인하고 시스템의 “활성화 된”부분에 대해 하위 프로세스를 실행하는 “마스터”스크립트를 작성하는 경우 끔찍한 실수를 저지르는 것 ossec-control입니다.

그러한 자체 제작 메커니즘은 체계적으로 필요하지 않습니다. 그것은 이미 서비스 관리자. /unix//a/200365/5132 에 따르면 systemd 에서이 문제를 해결하는 올바른 방법은 “서브 서비스”를 시도하는 엉뚱하고 혼란스러운 시도를 일으키는 하나의 서비스를 사용하지 않는 것입니다. 각 아동은 자신의 권리에 따라 본격적인 시스템 서비스로 처리해야합니다. 그런 다음 일반 시스템 제어를 사용하여 시스템의 다양한 부분을 활성화 및 비활성화하고 시작 및 중지합니다. OSSEC HIDS 사례에서 볼 수 있듯이 간단한 템플릿 서비스 단위는 거의 모든 서비스를 처리하며 (하나의 예외는 /ubuntu//a/624871/43344에서 ) systemctl enable ossec@agentlessd.service선택적 서비스 활성화 와 같은 작업을 수행 할 수 있습니다.agentlessdSystem 5에 필요한 끔찍한 “마스터 스크립트”메커니즘이 전혀 필요하지 않습니다 rc.

그러한 생각이 필요한 OSSEC HIDS만큼 극단적이지 않은 경우가 많이 있습니다. exim 및 sendmail과 같은 MTS는 두 가지입니다. 하나 rc는 실행 파일을 정확하게 제어하기 위해 구성 파일에 많은 임시 쉘 변수와 함께 큐 실행기, SMTP 제출 데이터 및 SMTP 릴레이 데이터를 생성 하는 단일 스크립트를 가지고있을 수 있습니다 . 그러나 systemd를 사용 하여이 작업을 수행하는 올바른 방법은 3 개의 적절한 서비스 장치 (2 개는 소켓 장치 가 연결되어 있음)를 가지고 있으며, 서비스 관리자의 규칙적인 메커니즘만으로 임시 항목이 전혀없는 것입니다.