수행하는 방법시스템 제어 시간제 노동자특정 트리거 시간에 컴퓨터가 종료되면 작동합니까? " " 옵션이 있는데 Persistent
명령은 언제 실행되나요? 명령이 안전하게 실행된다는 것이 어느 정도 보장됩니까? 예를 들어 실행 사이에 주어진 최대 시간이 경과되지 않습니다.
상태:
$ systemctl status mintupdate-automation-upgrade.timer
● mintupdate-automation-upgrade.timer - Update Manager automatic upgrades
Loaded: loaded (/lib/systemd/system/mintupdate-automation-upgrade.timer; enabled; vendor preset: enabled)
Active: active (waiting) since Fri 2021-01-22 20:20:24 CET; 4 days ago
Trigger: Thu 2021-01-28 00:44:21 CET; 12h left
Triggers: ● mintupdate-automation-upgrade.service
구성 파일
$ systemctl cat mintupdate-automation-upgrade.*
# /lib/systemd/system/mintupdate-automation-upgrade.timer
[Unit]
Description=Update Manager automatic upgrades
[Timer]
OnCalendar=daily
OnStartupSec=60m
RandomizedDelaySec=60m
Persistent=true
[Install]
WantedBy=timers.target
# /lib/systemd/system/mintupdate-automation-upgrade.service
[Unit]
Description=Update Manager automatic upgrades
After=network-online.target
[Service]
Type=oneshot
CPUQuota=50%
CPUWeight=20
IOWeight=20
ExecStart=/usr/lib/linuxmint/mintUpdate/automatic_upgrades.py
[Install]
WantedBy=multi-user.target
타이머에는 지속성 플래그가 있지만 서비스(타이머에 의해 트리거됨)에는 지속성 플래그가 없습니다.
$ systemctl show mintupdate-automation-upgrade.timer --property=Persistent
Persistent=yes
답변1
Persistent=
타이머에만 적용됩니다(참조:man systemd.timer
). 그래서 당신은 그것을 볼 수 없습니다
systemctl show mintupdate-automation-upgrade.service --property=Persistent
타이머를 보면 다음과 같이 표시됩니다.
[Timer]
OnCalendar=daily
OnStartupSec=60m
RandomizedDelaySec=60m
Persistent=true
OnCalendar=
daily
: 달력 이벤트 표현식을 사용하여 실시간(예: 벽시계) 타이머를 정의합니다.daily
. 이것이 실제로 의미하는 바는 매일 밤 자정에 실행된다는 것입니다.Persistent=true
: "서비스 단위가 마지막으로 트리거된 시간이 디스크에 저장됩니다. 타이머가 활성화되면 타이머가 활성화되지 않은 동안 서비스 단위가 한 번 이상 트리거되면 즉시 서비스 단위가 트리거됩니다. 이러한 트리거에도 불구하고, 시스템 전원이 꺼졌을 때 누락된 서비스 실행을 따라잡는 데 유용한 RandomizedDelaySec=으로 인한 지연의 영향을 여전히 받습니다."OnStartupSec=60m
서비스 관리자가 처음 시작된 시간을 기준으로 타이머를 정의합니다.RandomizedDelaySec=60m
0에서 60m 사이에서 무작위로 선택되고 균등하게 분배된 시간만큼 타이머를 지연시킵니다. 각 타이머 장치는 각 반복 전에 이 지연을 무작위로 결정하며 지연은 다음으로 결정된 경과 시간 위에 추가됩니다. 이 설정을 사용하면 유사하게 구성된 타이머 이벤트의 일정을 일정 간격으로 확장하여 이벤트가 동시에 실행되어 잠재적으로 리소스 정체를 일으키는 것을 방지할 수 있습니다.
따라서 밤새 기계를 방치하면 자정부터 01:00 사이에 트리거됩니다. 컴퓨터를 다시 시작하면 시작 후 1~2시간 이내에 트리거됩니다. 밤새 컴퓨터를 종료하면 아침에 부팅 후 1시간 이내에 실행되고( OnCalendar
/ Persistent
트리거의 경우) 부팅 후 1~2시간 이내에 다시 실행됩니다( OnStartupSec
/trigger의 경우).
나는 당신의 가장 큰 관심사가 23:00에 기계를 시작할 때 무슨 일이 일어나는지 의심합니다. 이 경우 00:00에서 01:00 사이에 두 번 실행됩니다. 트리거가 실행될 때 서비스가 oneshot
계속 실행 중이 면 activating
트리거가 무시됩니다. ExecStart=
따라서 동일한 서비스에 대해 두 개의 동시 트리거가 없으므로 안전합니다.
그러나 실행 사이의 최소 시간을 요구합니다. 우리는 일반적으로 사물을 안전하게 유지하기 위해 "시간"을 사용하지 않으려고 노력합니다. 이는 bash 스크립트를 추가하는 것과 유사하며 sleep
, 너무 게을러서 적절한 신호를 수신할 수 없을 때 해결 방법이 되는 경우가 많습니다( ./foo & sleep 5 && ./bar
). 또한 시간이 만료되었을 때 실제로 준비가 될 것이라는 보장이 없기 때문에 위험한 작업이기도 합니다. 이 스크립트를 잘 작성했다면 별도의 시간( ) 없이 연속해서 여러번 실행해야 하므로 ./foo && ./foo && ./foo
보안에 대해서는 걱정하지 않으셔도 됩니다.
답변2
것 같다일하지 않을거야, 컴퓨터가 꺼져 있거나 인터넷에 연결되어 있지 않으면 다음 메시지가 계속 나타나므로 따라갈 수 없습니다.
$ systemctl --no-pager status mintupdate-automation-upgrade.timer
...
Trigger: Tue 2021-02-02 00:32:40 CET; 13h left
따라서 업데이트 프로세스(적어도 이 접근 방식을 사용하는 경우 unattended-upgrades
)는 다음과 같습니다.별로 안전하지 않음.
고칠 수 있는지 알려주세요.