SystemD가 N 프로세스를 생성합니까?


13

우리 조직에는 수많은 대기열 소비 작업자 프로세스가 있습니다. 현재 SupervisorD를 사용하여 관리하고 있지만 가능한 경우 SystemD를 사용하고 싶습니다. 사용자 지정 단위를 작성하는 데 상당히 익숙하지만 즉시 SystemD 랜드에 아날로그가 없습니다.

에서 SupervisorD 문서 라는 매개 변수는 numprocs하나 그들이 서비스를 시작하고 싶습니다 프로세스의 수를 설정할 수있는 자세히 설명되어 있습니다. 30 개의 프로세스를 시작하려면 한 줄만 변경하면됩니다.

SystemD 단위에 시작하려는 프로세스 수를 지정할 수있는 설정이 있습니까?


1
같은 단위의 여러 인스턴스를 만들려고합니까? 그렇다면 0pointer.de/blog/projects/instances.html
Munir

답변:


31

Munir가 언급 한 것은 정확하게 어떻게하는 것입니다. 기본적으로 service파일 을 만들고 30 번 시작합니다. 이제는 조금 비천한 것처럼 보일지 모르지만 잘못 작동하는 경우 하나를 종료하고 모든 것을 종료하지 않아도되는 등의 이점이 있습니다. 관리를 쉽게하기 위해 할 수있는 일도 있습니다.

먼저 단위 파일입니다. 와 같은 파일을 작성하십시오 /etc/systemd/system/test@.service. 중요한 것은 @상징입니다.

내용은 다음과 같습니다.

[Service]
ExecStart=/bin/sleep 600 %I

[Install]
WantedBy=multi-user.target

그리고 그것을 시작 systemctl start test@1.service, systemctl start test@2.service.
시작되는 프로세스는 다음과 같습니다.

root     17222  19   0  0.0  0.0 Ss         00:05 /bin/sleep 600 1
root     17233  19   0  0.0  0.0 Ss         00:02 /bin/sleep 600 2

이 통지 %I는 후에 넣어 어떤 치환 된있어 @당신이 그것을 시작했을 때.

작은 셸 푸로 30 개를 모두 시작할 수 있습니다.

systemctl start test@{1..30}.service

부팅 할 때 일반 서비스처럼 활성화 할 수도 있습니다 systemctl enable test@1.service.

 

이제 관리를 쉽게하기 위해 할 수있는 일이 무엇을 의미합니까? 아마도 test@{1..30}.service모든 것을 관리하는 데 사용하고 싶지 않을 수도 있습니다 . 조금 다루기 힘들다. 대신 서비스에 대한 새 대상을 만들 수 있습니다.

로 작성 /etc/systemd/system/test.target:

[Install]
WantedBy=multi-user.target

그런 다음 /etc/systemd/system/test@.service다음과 같이되도록 조정하십시오 .

[Unit]
StopWhenUnneeded=true

[Service]
ExecStart=/bin/sleep 600 %I

[Install]
WantedBy=test.target

로 시스템을 다시로드 systemctl daemon-reload하십시오 (단위 파일을 수정하고 이전 버전을 건너 뛰지 않은 경우에만 필요). 이제을 수행하여 관리하려는 모든 서비스를 활성화하십시오 systemctl enable test@{1..30}.service.
(이전에 서비스를 활성화 한 WantedBy=multi-user.target경우 먼저 비활성화하여 종속성을 지 웁니다)

이제 systemctl start test.target및을 수행 할 수 있으며 systemctl stop test.target30 개의 프로세스를 모두 시작 / 중지합니다.
다시 부팅하면 다른 장치 파일처럼 부팅 할 수 있습니다 systemctl enable test.target.


이 자세한 답변에 감사드립니다. 며칠 동안 검색했습니다.
arnolem

1
실패한 프로세스가 다시 시작되는지 알고 있습니까?
bastian

@bastian : 사용할 수 있습니다 Restart=on-failure. 자세한 내용은 systemd.service매뉴얼 페이지를 참조하십시오.
siride

1

다음은 virtualenv에서 실행되는 Python 스크립트를 사용하는 예제입니다.

/etc/systemd/system/my-worker@.service

[Unit]
Description=manages my worker service, instance %i
After=multi-user.target

[Service]
PermissionsStartOnly=true
Type=idle
User=root
ExecStart=/usr/local/virtualenvs/bin/python /path/to/my/script.py
Restart=always
TimeoutStartSec=10
RestartSec=10

비활성화 : sudo systemctl enable my-worker\@{1..30}.service

N 근로자 사용 : sudo systemctl enable my-worker\@{1..2}.service

새로 고침 : sudo systemctl daemon-reload

스타트: sudo systemctl start my-worker@2.service

상태를 확인하세요: sudo systemctl status my-worker@1

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