systemd 서비스 파일: 유형=원샷 서비스는 다시 시작할 수 없습니다=실패했습니다.

systemd 서비스 파일: 유형=원샷 서비스는 다시 시작할 수 없습니다=실패했습니다.

성공할 때까지 재시도해야 하는 두 개의 rsync 명령을 순차적으로 실행하기 위해 systemd 서비스 파일을 만들었습니다. 때때로 rsync 서버가 다운되는 경우가 있습니다. Systemd에서는 Type=oneshot 서비스가 Restart=on-failure를 허용하지 않는다고 알려줍니다. 어떤 다른 유형의 서비스를 이용할 수 있나요?

[Unit]
Description=Sync

[Service]
Type=oneshot
Restart=on-failure
ExecStart=/usr/bin/rsync -atvzq --no-owner --no-group --delete rsync://(some address) /srv/www/
ExecStart=/usr/bin/rsync -atvzq --no-owner --no-group --delete rsync://(some address) /srv/www1/

답변1

나는 당신이 Type=oneshot이것을 사용하여 몇 가지 명령을 가질 수 있다고 가정합니다 ExecStart=. 그 외에는 Type=oneshot활성화 성공 후 실행되는 서비스가 없는 것 같고, 사용하고 있지 않기 때문에 사용할 이유가 없습니다.RemainAfterExit=true

대신 사용 Type=simple하고 사용하십시오.ExecStartPre=

[Service]
Type=simple
Restart=on-failure
ExecStartPre=/usr/bin/rsync -atvzq --no-owner --no-group --delete rsync://(some address) /srv/www/
ExecStart=/usr/bin/rsync -atvzq --no-owner --no-group --delete rsync://(some address) /srv/www1/

다음과 같은 일이 발생합니다:

  1. ExecStartPre=명령 전에 실행됩니다 ExecStart=.
  2. 실행하는 동안 ExecStartPre=장치가 "활성화"됩니다.
  3. ExecStartPre=실패 하면 ExecStart=실행되지 않으며 장치는 "실패"로 간주되어 다시 시작됩니다.
  4. 실행하는 동안 ExecStart=장치가 "활성화"됩니다.
  5. 일단 완료되면 ExecStart=모든 것이 성공하면 장치가 "비활성(죽음)" 상태가 되고 명령이 실패하면 "실패" 상태가 됩니다.

ExecStartPre=실패를 무시 하고 강제로 ExecStart=실행 하려면 0이 아닌 종료 코드를 무시하도록 ExecStartPre=명령 앞에 를 붙이십시오.-

답변2

예를 들어, 두 서비스 A와 B를 사용해 볼 수 있습니다. 여기서 B는 A에 종속되고 A는 일회성 서비스입니다.

아래 예에 표시된 설정을 사용하면 다중 사용자 목표(또는 [설치] 섹션에서 지정한 다른 목표)에 도달하면 서비스 B가 시작됩니다. 서비스 B는 서비스 A에 의존하고 서비스 A 다음에 시작되도록 설정되어 있으므로 서비스 A보다 먼저 시작되지 않습니다. 또한 서비스 A는 oneshot 유형이므로 서비스 B는 서비스 A가 종료될 때까지 기다립니다.

서비스 A는 서비스 B에 필요하므로 서비스 A가 실패하면 서비스 B가 시작되지 않습니다. 서비스 B가 실패하면 다시 시작됩니다. 기본 설정에서는 systemd가 추가 재시작 시도를 중지하기 전에 허용되는 실패한 재시작 시도 횟수(주어진 간격 내)에 제한을 둡니다.

나. 서비스

[Unit]
Description=Sync Task B Service
Requisite=A.service
After=A.service

[Service]
Type=simple
Restart=on-failure
ExecStart=/usr/bin/rsync -atvzq --no-owner --no-group --delete rsync://(some address) /srv/www/

[Install]
WantedBy=multi-user.target

서비스

[Unit]
Description=Sync Task A Service

[Service]
Type=oneshot
ExecStart=/usr/bin/rsync -atvzq --no-owner --no-group --delete rsync://(some address) /srv/www/

관련 정보