Unix 타임스탬프로 식별되는 특정 시간에 명령이 실행되도록 예약하고 싶습니다. 이는 systemd를 사용하여 달성할 수 있는 것처럼 보이지만 systemd-run
어떻게 작동합니까? 명령이 예약되는 동안 시스템의 전원이 꺼지거나 일시 중지되면 예약된 명령은 어떻게 되나요?
at
관련 질문: from을 사용하여 동일한 작업 수행 atd
(현재까지의 타임스탬프를 구문 분석해야 함):at 명령을 사용하여 특정 타임스탬프에 작업이 실행되도록 예약할 수 있습니까?
답변1
systemd-run
특정 시간에 명령이 실행되도록 예약할 수 있습니다.을 텐데:
- 일시적인 타이머와 서비스 파일을 /run에 기록하고 재부팅 시 지워지기 때문에 시스템은 그 때까지 전원이 꺼지지 않습니다.
- "WakeSystem" 옵션(아래 참조)을 사용하지 않는 한 시스템은 이 특정 시간 동안 일시 중지되지 않습니다.
재시작 지속성 옵션은 아래를 참조하세요.
간단한 예 systemd-run
:
# generate an arbitrary timestamp, in seconds-since-the-epoch
timestamp=$(date -d 'now + 42 seconds' +%s)
systemd-run --on-calendar "$(date -d @"$timestamp" +'%F %T')" \
--timer-property=AccuracySec=1us \
touch /tmp/done
systemd-run
에포크 이후 초 단위의 타임스탬프를 사용하는 데 있어 중요한 부분은 다음과 같습니다.
- 사용
--on-calendar
및 - 여기서 GNU 날짜는 에포크 타임스탬프 이후의 초를
systemd-run
이해할 수 있는 형식으로 변환하는 데 사용됩니다. 결과가 다음과 같은 경우에는 타임스탬프를 직접 입력하거나 변환할 수 있습니다.OnCalendar가 이해하는 형식.
OnCalendar에 대한 현재 문서에서는 epoch 타임스탬프 이후 초 단위 입력을 직접 지원한다고 나와 있습니다. "@seconds" 지원이 추가되었습니다.시스템 버전 234(이 페이지에서 파일을 검색하세요 src/basic/calendarspec.c
)제출됨80e5b7. 시스템 버전이 이보다 먼저 변경되었을 수 있습니다.
- RHEL 7은 systemd 208로 시작되었으며 나중에 버전 219로 업그레이드되었습니다. RHEL 8은 버전 239(인용하다).
- Debian 8은 버전 215를 사용하고 Debian 9는 버전 232를 사용하며 Debian 10은 버전 241(인용하다).
- Ubuntu 16.04 LTS는 버전 229, Ubuntu 17.10은 버전 234, Ubuntu 18.04 LTS는 버전 237(인용하다).
충분히 새로운 시스템 버전을 사용하면 다음 호출을 사용할 수 있습니다.
timestamp=$(date -d 'now + 42 seconds' +%s)
systemd-run --on-calendar "@${timestamp}" \
--timer-property=AccuracySec=1us \
touch /tmp/done
나는 또한AccuracySec의 타이머 속성, 기본값은 1분입니다. 설명서에 따라 값을 조정해야 합니다.
전력 소비를 최적화하려면 이 값을 가능한 한 높게, 필요한 만큼 낮게 설정하십시오.
아직 테스트하지는 않았지만 다음과 같은 타이머 옵션도 있습니다 WakeSystem
.
일시 중단된 상태에서 시스템을 재개합니다(시스템이 일시 중단되고 시스템이 이 작업을 지원하는 경우). 이 옵션은 시스템이 적절한 시간에 다시 시작되도록 보장하고 수행할 작업이 완료된 후 시스템을 다시 일시 중지하지 않는다는 점에 유의하세요.
위와 같이 다음과 같이 통합할 수 있습니다.
timestamp=$(date -d 'now + 42 seconds' +%s)
systemd-run --on-calendar "$(date -d @"$timestamp" +'%F %T')" \
--timer-property=AccuracySec=1us \
--timer-property=WakeSystem=true \
touch /tmp/done
특정 시간에 명령을 실행하도록 systemd에 요청하십시오.재부팅 후에도 여전히 존재함, 특정 로그인 세션과 관계없이 타이머 및 서비스 단위 파일을 /etc/systemd/system/
./etc/systemd/system은 로컬 구성이 저장되는 곳입니다.시스템을 위해.
샘플 타이머 파일은 다음과 같습니다.
[Timer]
AccuracySec=1us
[Unit]
Description=2020-01-22 09:50:00 timer
[Timer]
OnCalendar=2020-01-22 09:50:00
샘플 서비스 파일은 다음과 같습니다.
[Unit]
Description=my 2020-01-22 09:50:00 service
[Service]
ExecStart=
ExecStart=@/usr/bin/bash "/usr/bin/bash" "-c" "echo 2020-01-22 09:50:00 timer and service ran > /tmp/done"
그런 다음 해당 파일을 다시 로드하여 systemd에 알릴 수 있습니다.
systemctl daemon-reload
...그리고 타이머를 활성화합니다.
systemctl enable foo.timer
...그리고 타이머를 시작합니다.
systemctl start foo.timer
시간이 지나면 /etc/systemd/system에서 만료된 타이머와 서비스 단위를 주기적으로 삭제해야 할 수도 있습니다.