저는 systemd를 사용하여 서로 다른 매개변수를 사용하여 동일한 프로그램을 여러 번 실행할 수 있는 여러 인스턴스가 있는 구조를 만들었습니다. 내 의도는 각 인스턴스가 다른 인스턴스와 독립적이라는 것입니다. 한 인스턴스가 실패하면 다른 인스턴스는 변경되지 않고 다시 시작됩니다.
이것이 나의 목표 유닛입니다:
[Unit]
Description=Cutter
After=FD-go-00_tree.service
After=FD-go-01_pre.service
[email protected] [email protected] [email protected] [email protected]
[Install]
WantedBy=FD-go-00_tree.service
이것은 내 서비스 단위입니다.
[Unit]
Description="FD-cutter # %i - instance"
After=FD-go-00_tree.service
After=FD-go-01_pre.service
PartOf=FD-go-05_cutter.target
ConditionPathExists=/home/himarc/projects/multi-service/EnvironmentFile/FD-go-05_cutter_%i
# StartLimitIntervalSec in recent systemd versions
StartLimitInterval=0
[Service]
Type=simple
EnvironmentFile=/home/himarc/projects/multi-service/EnvironmentFile/FD-go-05_cutter_%i
ExecStart=/usr/bin/nice -n -1 /home/himarc/projects/bin/FD-cutter ${MyInput_1} ${MyInput_2} ${MyPath} %i
StandardOutput=file:/srv/FD/%i/trace/FD-log-cutter.log
StandardError=file:/srv/FD/%i/trace/FD-log-cutter.log
Restart=always
# time to sleep before restarting a service
RestartSec=1
[Install]
WantedBy=FD-go-00_tree.service
인스턴스가 실패하면 개별 서비스를 다시 시작하는 대신 전체 대상 셀이 다시 시작됩니다.
Aug 25 11:15:06 localhost kernel: [2493693.364584] FD-cutter[21251]: segfault at 4c8 ip 000055d7ee0d9e28 sp 00007f312186caf0 error 6 in FD-cutter[55d7ee0d2000+1a000]
Aug 25 11:15:06 localhost kernel: [2493693.364591] Code: f8 ff ff 48 8d 15 08 22 21 00 48 8d 35 d1 26 21 00 48 8b 05 32 25 21 00 48 8d 3d 2b 25 21 00 48 c7 05 e8 21 21 00 00 00 00 00 <48> 89 88 c8 04 00 00 48 89 90 d0 04 00 00 48 89 e9 31 d2 e8 e0 dd
Aug 25 11:15:06 localhost systemd[1]: [email protected]: Main process exited, code=killed, status=11/SEGV
Aug 25 11:15:06 localhost systemd[1]: [email protected]: Failed with result 'signal'.
Aug 25 11:15:08 localhost systemd[1]: [email protected]: Service hold-off time over, scheduling restart.
Aug 25 11:15:08 localhost systemd[1]: [email protected]: Scheduled restart job, restart counter is at 1.
Aug 25 11:15:08 localhost systemd[1]: Stopped target Cutter.
Aug 25 11:15:08 localhost systemd[1]: Stopping Cutter.
Aug 25 11:15:08 localhost systemd[1]: Stopping "FD-cutter # RC1P112 - instance"...
Aug 25 11:15:08 localhost systemd[1]: Stopping "FD-cutter # RC1P111 - instance"...
Aug 25 11:15:08 localhost systemd[1]: Stopping "FD-cutter # RC1P212 - instance"...
Aug 25 11:15:08 localhost systemd[1]: Stopped "FD-cutter # RC1P211 - instance".
Aug 25 11:15:08 localhost systemd[1]: Started "FD-cutter # RC1P211 - instance".
Aug 25 11:15:08 localhost systemd[1]: Stopped "FD-cutter # RC1P112 - instance".
Aug 25 11:15:08 localhost systemd[1]: Stopped "FD-cutter # RC1P111 - instance".
Aug 25 11:15:08 localhost systemd[1]: Stopped "FD-cutter # RC1P212 - instance".
Aug 25 11:15:08 localhost systemd[1]: Started "FD-cutter # RC1P212 - instance".
Aug 25 11:15:08 localhost systemd[1]: Started "FD-cutter # RC1P111 - instance".
실패한 서비스 단위만 다시 시작하고 다른 서비스 단위는 다시 시작하지 않는 방법이 있나요?
답변1
Requires=
대상과 인스턴스 간의 관계를 추가했습니다 . 매우 강한 관계입니다. ~에 따르면시스템 유닛(5)이는 다음을 의미합니다.
필요=
Wants=와 유사하지만 더 강력한 종속성을 선언합니다. 이러한 유형의 종속성은 유닛 파일과 함께 제공되는 .requires/ 디렉터리에 심볼릭 링크를 추가하여 구성할 수도 있습니다.
이 장치가 활성화되면 나열된 장치도 활성화됩니다. 다른 장치 중 하나가 활성화되지 않고 주문 종속성 After=가 실패한 장치에 설정된 경우 해당 장치는 시작되지 않습니다. 또한 After= 지정 여부에 관계없이 다른 장치 중 하나가 명시적으로 중지되면 이 장치가 중지됩니다.
일반적으로 실패한 서비스에 대해 시스템을 더욱 강력하게 만들려면 Requires= 대신 Wants=를 사용하는 것이 좋습니다.
따라서 로 변경하면 Requires=
시작 Wants=
대상이 템플릿 서비스를 시작하지만 템플릿 서비스 실패는 대상에 영향을 미치지 않습니다.