우리 조직에는 작업자 프로세스를 사용하는 대기열이 많이 있습니다. 현재는 SupervisorD를 사용하여 관리하고 있지만 가능하다면 SystemD를 사용하여 이러한 이점 중 일부를 얻고 싶습니다. 나는 사용자 정의 단위를 작성하는 데 꽤 경험이 있지만 SystemD 세계에서 비슷한 것을 즉시 찾지 못했습니다.
내부에SupervisorD 문서"detailed"라는 매개변수를 사용 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
30 systemctl stop test.target
개의 프로세스가 모두 시작/중지됩니다.
마찬가지로 다른 유닛 파일처럼 시작 시 활성화할 수 있습니다 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