systemd: 시스템이 다운되었을 때 작업을 주기적으로 한 번 실행하는 방법은 무엇입니까?

systemd: 시스템이 다운되었을 때 작업을 주기적으로 한 번 실행하는 방법은 무엇입니까?

정기적으로(예: 5분마다) 작업을 실행하고 마지막으로 시스템이 종료될 때 작업을 실행하고 싶습니다.

Systemd는 정기적으로 작업을 실행하는 데 사용할 수 있는 타이머를 지원합니다. 또한 ExecStop다음과 같은 후크를 사용하여 시스템 종료 시 작업 실행을 지원합니다 .

[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/bin/true
ExecStop=<some command to run at system shutdown>

하지만 두 가지 접근 방식을 결합하는 데 문제가 있습니다. 내가 생각할 수 있는 유일한 옵션은 두 가지 별도의 서비스를 작성하는 것입니다.

  1. 타이머 작업에 의해 트리거되는 서비스
  2. ExecStop시스템이 종료될 때 실행하기 위해 이 트릭을 사용하는 또 다른 서비스

나는 그것이 효과가 있다고 생각하지만 이 접근 방식에는 두 가지 문제가 있습니다.

  1. 보안 설정 관련 코드 중복이 많습니다
  2. systemd는 작업이 병렬로 실행되는 것을 막을 수 없습니다. 예를 들어, 정기적인 작업이 실행되는 동안 종료가 트리거되면 두 작업이 병렬로 실행됩니다.

질문:

  • 주기적으로 작업을 실행하고 시스템이 다운되었을 때 한 번만 작업을 실행하는 가장 좋은 방법은 무엇입니까?
  • 두 개의(대부분 중복된) 서비스 파일을 갖는 것을 방지할 수 있습니까?

코드 중복이 무엇을 의미하는지 이해하기 위해 작업을 실행할 때 사용하는 몇 가지 보안 설정은 다음과 같습니다.

User=foo
ProtectSystem=strict
ProtectHome=yes
PrivateTmp=yes
ProtectKernelTunables=yes
ProtectKernelModules=yes
ProtectControlGroups=yes
NoNewPrivileges=yes
PrivateDevices=yes
PrivateUsers=yes
CapabilityBoundingSet=
AmbientCapabilities=
SystemCallFilter=~@clock @module @mount @obsolete @raw-io ptrace
ReadOnlyPaths=-/some/path

제가 작성한 방법에서는 이 코드를 복사해야 합니다(서비스당 하나의 복사본).

답변1

foo-at-shutdown.service.d'foo-periodic.service.d'라는 두 개의 디렉터리를 생성하여 중복 문제를 해결할 수 있습니다.

한 폴더에 foo-shared.conf. 라는 파일을 만들고
심볼릭 링크를 사용하여 두 번째 폴더에 추가합니다.

이는 "플러그인" 장치이며 기본 프로필로 가져옵니다. man systemd.unit거기서 "drop-in"으로 검색하시면 더 많은 기록이 있습니다.

내 생각에는 두 개의 서비스 파일, 타이머 파일, 공유 삽입 단위 파일을 갖는 것이 합리적인 접근 방식이라고 생각합니다.

관련 정보