저는 RedHat 튜토리얼을 따르고 있으며 systemd를 사용하여 이벤트를 실행하는 방법을 배우려고 합니다. 다음 서비스를 만들었습니다.
[Unit]
Description=Script2 Logged-In Users
[Service]
Type=simple
ExecStart=/root/Documents/Scripts/script2
[Install]
WantedBy=muti-user.target
다음 스크립트를 참조합니다.
#!/bin/bash
echo "Users logged in as of $(date)" >> ~/Documents/UserFiles/useractivity.txt
who >> ~/Documents/UserFiles/useractivity.txt
스크립트를 독립형으로 실행하면 성공적으로 실행되지만 타이머를 통해 실행하려고 하면 시작한 후에만 실행됩니다. 타이머 파일입니다
[Unit]
Description=Execute Script2 every 10 seconds
[Timer]
#OnBootSec=10min (run script 10 mins after boot)
#OnCalendar=Mon 2015-*-1 10:00:00 (run script at 10am on 1st day of every month if it's a Monday)
#OnCalendar=*:0/15 (run script every 15 minutes)
OnUnitActiveSec=10s (run script every 10 seconds)
unit=script2.service
서비스 상태를 확인할 때 나타나는 오류입니다.
script2.service - Script2 Logged-In Users
Loaded: loaded (/etc/systemd/system/script2.service; enabled; vendor preset: disabled)
Active: inactive (dead)
Aug 08 15:17:38 localhost.localdomain script2[7918]: /root/Documents/Scripts/script2: line 3: Documents/UserFiles/useractivity.txt: No such file or directory
Aug 08 15:17:38 localhost.localdomain script2[7918]: /root/Documents/Scripts/script2: line 4: Documents/UserFiles/useractivity.txt: No such file or directory
Aug 08 15:17:38 localhost.localdomain systemd[1]: script2.service: main process exited, code=exited, status=1/FAILURE
Aug 08 15:17:38 localhost.localdomain systemd[1]: Unit script2.service entered failed state.
Aug 08 15:17:38 localhost.localdomain systemd[1]: script2.service failed.
Aug 08 15:24:44 localhost.localdomain systemd[1]: Started Script2 Logged-In Users.
Aug 08 15:25:44 localhost.localdomain systemd[1]: Started Script2 Logged-In Users.
Aug 08 15:28:19 localhost.localdomain systemd[1]: Started Script2 Logged-In Users.
Aug 08 15:29:34 localhost.localdomain systemd[1]: Started Script2 Logged-In Users.
Aug 08 15:45:58 localhost.localdomain systemd[1]: Started Script2 Logged-In Users.
이것이 타이머를 나열할 때 얻는 결과입니다.
NEXT LEFT LAST PASSED
Tue 2022-08-09 00:00:00 EDT 8h left Mon 2022-08-08 11:17:23 EDT 4h 40min ago
Tue 2022-08-09 12:16:53 EDT 20h left Mon 2022-08-08 12:16:53 EDT 3h 40min ago
n/a n/a n/a n/a
참고: 처음 두 개는 서로 다른 프로세스에서 나온 것입니다.
왜 타이머가 작동하지 않는지 잘 모르겠습니다.
답변1
을 사용하면 OnUnitActiveSecs
다음을 의미합니다.
활성화된 타이머 장치와 관련하여 장치가 마지막으로 활성화된 시간을 기준으로 타이머를 정의합니다.
타이머가 있기 때문에장치가 마지막으로 활성화된 시간을 기준으로 합니다., 타이머가 생성된 이후 장치가 시작되지 않은 경우 타이머는 절대 실행되지 않습니다.
exampleservice.service
다음 콘텐츠로 생성 하면 간단한 예를 통해 이를 달성할 수 있습니다 .
[Service]
Type = simple
ExecStart = /bin/sh -c 'date >> /tmp/datelog.txt'
exampleservice.timer
다음을 포함합니다 .
[Timer]
OnUnitActiveSec=10s
타이머를 시작합니다.
systemctl start exampleservice.timer
타이머에 "다음" 또는 "마지막" 실행 시간이 없다는 것을 알 수 있습니다.
$ systemctl list-timers | grep example
n/a n/a n/a n/a exampleservice.timer exampleservice.service
하지만 서비스를 한 번 시작하면 다음과 같습니다.
systemctl start exampleservice
타이머에 즉시 "다음" 실행 시간이 있다는 것을 알 수 있습니다.
$ systemctl list-timers | grep example
Mon 2022-08-08 18:17:15 EDT 9s left n/a n/a exampleservice.timer exampleservice.service
10초 동안 기다리면 주기적으로 실행되는 것을 볼 수 있습니다.
$ systemctl list-timers | grep example
Mon 2022-08-08 18:17:43 EDT 682ms left Mon 2022-08-08 18:17:33 EDT 9s ago exampleservice.timer exampleservice.service
서비스를 먼저 시작하지 않고 주기적으로 수행하려면 설명서를 확인하세요 systemd.timer
.
여러 명령어는 동일한 유형과 다른 유형으로 구성될 수 있으며, 이 경우 타이머 장치는 지정된 타이머 표현식이 경과할 때마다 실행됩니다. 예를 들어 OnBootSec=과 OnUnitActiveSec=을 결합하면 주기적으로 실행되고 매번 특정 서비스를 활성화하는 타이머를 정의할 수 있습니다.
그렇기 때문에 일반적으로 다음 과 함께 보고 사용합니다. 이는 "시스템 시작 후 N초를 시작한 다음 그 후 매 M초마다 실행"을 의미합니다 OnBootSec
.OnUnitActiveSec
또는 OnCalendar
항목을 사용하여 동일한 목적을 달성할 수 있습니다.
[Timer]
OnCalendar = *-*-* *:*:00/10
이 작업은 10초마다 실행됩니다.