우리 조직에는 대기열을 소비하는 작업자 프로세스가 많이 있습니다. 현재는 SupervisorD를 사용하여 관리하고 있지만 특정 이점을 위해 가능하면 SystemD를 사용하고 싶습니다. 나는 사용자 정의 단위 작성에 상당히 경험이 있지만 SystemD에는 이에 대한 아날로그가 즉시 없습니다.
에서SupervisorD 문서numprocs
서비스와 함께 시작하려는 프로세스 수를 설정할 수 있는 매개변수가 자세히 설명되어 있습니다. 30개의 프로세스를 시작하려면 한 줄만 변경하면 됩니다.
시작하려는 프로세스 수를 지정할 수 있는 설정이 SystemD 장치에 있습니까?
답변1
Munir가 언급한 것이 바로 이 작업을 수행하는 방법입니다. 기본적으로 파일을 만들고 service
30번 시작합니다. 조금 불편해 보일 수도 있지만, 오작동하는 경우 그중 하나를 종료할 수 있고 모두 종료할 필요가 없다는 장점이 있습니다. 관리를 더 쉽게 하기 위해 수행할 수 있는 몇 가지 작업도 있습니다.
먼저 유닛 파일입니다. 와 같은 파일을 생성합니다 . 중요한 것은 상징이다./etc/systemd/system/[email protected]
@
내용은 다음과 같습니다.
[Service]
ExecStart=/bin/sleep 600 %I
[Install]
WantedBy=multi-user.target
그런 다음 , 로 시작하십시오 . 시작되는 프로세스는 다음과 같습니다.systemctl start [email protected]
systemctl start [email protected]
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
이후에 넣은 내용으로 대체되었습니다 .@
약간의 shell-fu로 30개 모두를 시작할 수 있습니다.
systemctl start test@{1..30}.service
일반 서비스처럼 부팅 시 활성화할 수도 있습니다 .systemctl enable [email protected]
test@{1..30}.service
이제 관리를 더 쉽게 하기 위해 할 수 있는 일이 의미하는 바는 아마도 모든 관리를 위해 사용하고 싶지 않을 수도 있다는 것입니다 . 조금 다루기 어렵습니다. 대신 서비스에 대한 새 대상을 생성할 수 있습니다.
다음을 사용하여 생성 /etc/systemd/system/test.target
:
[Install]
WantedBy=multi-user.target
그런 다음 다음과 같이 조정합니다./etc/systemd/system/[email protected]
[Unit]
StopWhenUnneeded=true
[Service]
ExecStart=/bin/sleep 600 %I
[Install]
WantedBy=test.target
다음을 사용하여 systemd를 다시 로드합니다 systemctl daemon-reload
(유닛 파일을 수정하고 이전 버전을 건너뛰지 않은 경우에만 필요함). 이제 다음을 수행하여 관리하려는 모든 서비스를 활성화하십시오 systemctl enable test@{1..30}.service
.
(이전에 서비스가 활성화된 경우 WantedBy=multi-user.target
서비스를 먼저 비활성화하여 종속성을 제거하십시오.)
systemctl start test.target
이제 및 을 수행 systemctl stop test.target
하면 30개의 프로세스가 모두 시작/중지됩니다.
그리고 다시, 다른 유닛 파일처럼 부팅 시 활성화할 수 있습니다: systemctl enable test.target
.
답변2
다음은 virtualenv에서 실행되는 Python 스크립트를 사용하는 예입니다.
/etc/systemd/system/[email protected]
[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 disable my-worker\@{1..30}.service
N 작업자 활성화:sudo systemctl enable my-worker\@{1..2}.service
다시 로드:sudo systemctl daemon-reload
시작:sudo systemctl start [email protected]
상태 확인:sudo systemctl status my-worker@1