시스템 및 프로세스 스폰


14

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


1
Server.py시작된 서비스 포크 (포크 된 경우)를 수행하는 방법에 대한 설명과 코드 없이 솔루션을 제공하기가 어렵습니다 . 그러나 일반적으로, 이것은 준비 프로토콜 불일치 문제입니다.
intelfx

BTW ExecStop=는 필요하지 않습니다. 중지시 systemd의 기본 조치는 프로세스를 종료하는 것입니다. KillMode=지시문 에 대한 설명서를 살펴볼 수 있습니다 .
intelfx

1
더 적절한 준비 프로토콜 (중 하나가없는 경우 그리고, 마지막으로 ... simple또는 forking실제로는), 최후의 수단이 될 것이다 Type=oneshot, RemainAfterExit=yes하고 KillMode=control-group.
intelfx

@intelfx 기본적으로 Python 스크립트는 Subprocess.call을 사용하여 화면에서 서버를 시작합니다. 스크립트는 다른 화면에서 시작 화면과 시작 화면을 알려주는 명령을 받기 때문에 그보다 더 복잡합니다. 사용 가능한 화면도 동적이므로 자체적으로 시스템 서비스를 사용할 수없는 이유는 무엇입니까? 이상적으로는 systemd 가이 화면을 서비스의 일부로 취급하기를 원하지 않지만 현재 동일한 프로세스 그룹에 덤프되어 다시 시작되면 마스터와 함께 죽습니다.
Bottswana

내 직감은 systemd가 그와 같은 제어 프로세스를 "처리"하지 않는다는 것입니다 (시작 시간에 PID를 조회하고 후자를 인식하지 못합니다 ...) : |
rogerdpack

답변:


9

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


그래도 수정보다 더 많은 해결 방법이있는 것 같습니다. 다른 답변을 참조하십시오 ...이 작업을 수행하고 "systemctl stop"을 수행하면 자식 프로세스가 종료되지 않습니다. systemctl의 감독 외부?
rogerdpack

5

나는 시작할 때 포크하고 다른 많은 프로세스를 시작하는 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 개는 소켓 장치 가 연결되어 있음)를 가지고 있으며, 서비스 관리자의 규칙적인 메커니즘만으로 임시 항목이 전혀없는 것입니다.


이에 대한 의견을 보내 주셔서 감사합니다. 서브셋 서비스를 사용하는 것이 합리적이지만 파이썬에서는 내가 할 수없는 이유로 이루어졌습니다. 내 유일한 해결책은이 방법을 작동시키는 방법을 찾는 것입니다. 그래도 고마워. 제대로하고 싶습니다.
Bottswana

스크립트가 시작하는 '서브'서비스는 gnu 화면에서 특정 사용자로 실행되는 서버입니다. 이러한 서버는 많이 변경되고 일부는 추가되고 일부는 제거되며 다른 곳에서 제어되므로 실제로는 시스템화 된 서비스가 될 수 없습니다. 복잡성이 증가하고 중앙에서 관리 할 수 ​​없기 때문입니다. 비 시스템 서버에서도 동일한 스크립트가 사용됩니다.
Bottswana

systemd에는 루트 액세스없이 서비스를 추가 및 제거 할 수있는 명시적인 기능이 있습니다. "시스템화되지 않은 서비스에도 사용됨"은 더 체계화 된 시스템을 추가하여 해결할 수없는 유일한 주장 중 하나 일뿐입니다. :)
Charles Duffy

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.