꽃삽질 : cron 과 anacron. 과연 둘은 친한 사이일까?

이걸 알아내려고 오랜 시간을 들이지는 않았지만, 그래도 맘 속에 담고 있은 시간(?)까지 따진다면 적어도 몇 개월은 되겠기에, 오랜만에 제목에도 ‘꽃삽질’을 넣어봤다.

cron 과 anacron 에 대해서 파기 시작한 이유는, Snapper 가 실행되지 않았기 때문이다. 틀림없이 snapper 는 /etc/cron.daily 에 들어가 있고, /etc/crontab 에 cron.daily 를 실행하는 명령이 들어가 있음에도, 한 번도 실행되지 않았다.
그 원인을 파악하면서, cron 과 anacron 에 대해 공부하게 됐고, 그 내용을 잊기 전에(어제 알아낸 내용이지만, 벌써 많은 걸 잊었다…) 정리하려 한다.


cron 일반

cron은 Daemon 이고, anacron 은 그렇지 않다. 이 차이가 뭘 뜻하는 지는 확실하다. cron 은 메모리에 상주하면서 계속 자신이 나설 기회를 호시탐탐(?) 노리고 있는 반면, anacron 은 필요할 때만 자신의 역할을 수행한다.

ps 로 확인하면 cron 은 상주하고 있지만, anacron 은 없음을 볼 수 있다. ‘cron’ 으로 grep 를 했어도, anacron 있다면 나와야 하는데 나오지 않는다.

$ ps aux | grep -i cron
root      1058  0.0  0.0  32608  3328 ?        Ss   10:27   0:00 /usr/sbin/cron -f

아무튼 anacron 은 그 ‘필요할 때’를 위해, (우분투에선) systemd 의 힘을 빌리고, 정확하게는 anacron.timer 라는 서비스를 이용한다.
이 내용은 뒤에 좀 더 자세히 설명하기로 한다.

cron 의 기본 설정 파일은 /etc/crontab 이다. 우분투 18.04 서버에서, 기본 설치된 이 파일의 내용은 이렇다.

/etc/crontab 
# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# m h dom mon dow user	command
17 *	* * *	root    cd / && run-parts --report /etc/cron.hourly
25 6	* * *	root	test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6	* * 7	root	test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6	1 * *	root	test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )

cron 은 시간을 정해놓고, 해당 시간에 설정한 프로그램을 실행하는 방식이다.
위의 상황을 풀어보자면,

  • 17 * : 매시 17분
  • * * * : 일 월 요일 순. 여기선 모두 * 로 되어 있으므로 ‘매일’ 이 된다.
  • root : 명령을 실행할 사용자 ID

이렇게 된다. 자세한 사항은 cron 설명서를 참고.

여기서 실제 명령은 cd / && run-parts --report /etc/cron.hourly 가 되는데, run-parts 라는 명령어가 좀 생소하다.
이 명령어는 ‘특정 디렉토리 안의 모든 프로그램을 실행하라(run scripts or programs in a directory)’는 기능을 갖고 있다. –report 는 실행되는 프로그램 중, 출력이 있는 프로그램들의 이름을 stdout/stderr 로 돌려주라는 선택사항인데, 실제 눈에 보이지는 않으니 큰 의미는 없지 않겠나 싶은 생각이 든다. 로그에 남으려나?

아무튼, 크론은 매시 17분, 매일 6:25, 매주 토요일(7) 6:47, 매월 1일 6:25 각각 해당 디렉토리의 프로그램/스크립트들을 실행한다.

그런데, cron.houly 는 바로 run-parts 를 실행하도록 되어 있지만, 그외 3개(daily, weekly, monthly)는 모두 앞에 이상한게 붙어있다.

test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )

얜 뭘까?
이를 위해선 두가지를 알아야 한다. 먼저 test 명령. 그리고 || 연산.

먼저 test.
test 는 파일의 형식을 검사해주는 목적을 갖는다. 결과로 True/False 를 반환한다. -x 는 대상파일이 실행가능한지를 검사한다. 따라서 위의 의미는 /usr/sbin/anacron 이 있는지를 묻고, 있으면 True 를 반환한다.

만약 anacron 이 설치되어 있다면 True 를 반환한다. 이후 || 연산을 해야 하는데..

|| 는 논리합(Logical Disjunction)이므로, 한쪽만 참이어도 참이고, 따라서 연산은 anacron 이 설치되어 있음을 확인했다면 거기서 끝난다.
다시 말해, anacron 이 있다면 run-parts 는 실행되지 않는다.

더 정확히 말해서, anacron 이 설치돼 있다면, 해당 시각(Daily 의 경우 오전 6:25)에 기기가 켜져 있다 하더라도 run-parts 는 실행되지 않는다.

얼레? 그럼 언제 실행되는거??? 여기서 anacron 이 등장한다. 이에 대해서는 anacron 항목에서 다시 설명하기로 한다.

cron 설정(전역)

위에서 설명했듯, cron 의 기본 설정 파일은 /etc/crontab 이다. 원하는 작업이 있다면 여기에 추가해도 된다. (그러나 anacron 의 장점을 취하고 싶다면, 여기보다는 아래 디렉토리에 넣어주는게 좋다.)

만약, 매시/매일/매주/매월마다 시행해야 할 작업이 있다면, 다음 디렉토리에 프로그램/스크립트를 넣어줘도 된다.

  • /etc/cron.daily
  • /etc/cron.hourly
  • /etc/cron.monthly
  • /etc/cron.weekly

여기에, /etc/cron.d 라는 디렉토리가 하나 더 있는데, 데비안 계열에서는 그냥 무시해도 되는 듯 하다. 정확한 용도를 잘 모르겠다.

그런데, /etc/cron… 디렉토리는 모두 관리자 영역이다. 즉, 모두 root 권한으로 실행된다. 물론, 특정 사용자 권한으로 실행할 수도 있다.
여기서 다시 /etc/crontab 의 cron.houly 를 보자면,

17 *	* * *	root    cd / && run-parts --report /etc/cron.hourly

17 * * * * 이후에 ‘root’ 라고 된 부분이 있다. 이게 바로 사용자를 특정지어주는 영역이다. 즉, 명령을 root 사용자 권한으로 실행하라는 뜻이 된다.
다시 말해, 이 부분에 사용자ID 를 넣어주면, 그 사용자 권한으로 명령이 실행된다.

그러나, 이를 위해선 /etc/crontab 을 편집해야 하고, 그를 위해선 ‘관리자’ 권한이 필요하다.

일개 사용자 나부랭이는 cron 작업을 할 수 없단건가?

cron 설정(사용자)

물론, 사용자 설정도 가능하다. 일반 사용자로 로그인 한 후 다음 명령을 내린다.

$ crontab -e

-e 는 Edit 라는 의미.
내용을 확인하려면 -l(list)를 붙인다.

이 파일의 형식은 /etc/crontab 과 똑같다. 다만, 사용자명(/etc/crontab 에서 본 root)을 넣는 열은 없다.

** 혹 fopen: Permission denied 오류가 발생한다면, 해결책은..?

0 21 * * * /home/userid/bin/backup

매일 밤 9시에 backup 프로그램을 실행하라는 설정이 개인 crontab 에 기록되었다.
crontab 설정에서는 /etc/crontab 도 마찬가지지만, 가능한한 실행파일 전체 경로를 넣어주는 편이 좋다.

그런데, 이 파일은 어디에 저장이 되어 있을까?
홈 디렉토리가 아니라, 조금 애매한 위치인, /var/spool/cron/crontabs/userid 에 저장되어 있는데, 이 파일에는 일반 사용자 권한으로는 접근이 불가능하다.
이 파일 자체는 사용자 소유지만, 그 위 디렉토리인 crontab이 root:crontab 소유이기고, 일개 사용자 나부랭이에겐 접근 권한이 없어서 보거나 복사할 방법이 없다.
아래에서 보듯, Sticky-bit T 가 적용되어 있어서 이 디렉토리로 들어갈 수가 없다.

# ls -al /var/spool/cron/crontabs
drwx-wx--T 1 root     crontab   16  5월 17 12:55 .
drwxr-xr-x 1 root     root      16  1월 16 20:19 ..
-rw------- 1 userid crontab 1213  5월 20 12:55 userid

따라서, 개인 crontab 설정을 보관하려면 이런 식으로 해줄 수 밖에 없다.

crontab -l >> ~/crontab.backup

이제 cron 에 관해 더 이상 할 얘기가 없다.
드디어, 나를 괴롭혔던 anacron 으로 넘어갈 차례가 됐다.

anacron, 그 기저에 깔린 의도는?

서버는 24시간 돌아가는 게 기본이다. 영어권에선 이걸 24/7(Twentyfour Seven)이라고 표현하던데, 아무튼 상시 켜져있으므로 cron 실행 시간을 언제로 하더라도 전혀 무리가 없다.

따라서 크론 기본 설정값도 새벽 6시 대로 해놓은 모양이다. 서버 사용량이 적은 시간을 택한 듯 하다.

그러나, 개인용 PC 는 그렇질 못하다. 그 시간에 켜 있으면 다행히 일련의 작업들이 수행되겠지만, 꺼져있을 경우는 다음 시간까지 기다려야만 한다. 만약 1년 내내 (재수없게도?) 그 시간에만 계속 꺼져있었다면 크론 작업은 한 번도 실행되지 않는 상황이 온다.

이를 위해 anacron 이 등장했다.

anacron 은 언제, 어떻게 실행되나?

위에서 본 /etc/crontab 에는 이렇게 설정되어 있었다.

17 *	* * *	root    cd / && run-parts --report /etc/cron.hourly
25 6	* * *	root	test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6	* * 7	root	test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6	1 * *	root	test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )

Hourly 는 어차피 매시간 실행되므로 굳이 anacron 의 도움을 받을 필요는 없다.
그외 Daily 부터는 실제로는 Cron 보다는 Anacron 이 실행하게 되어있다.

그럼, test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily ) 로 anacron 이 실행되나?

그렇지 않다.

test 명령은 anacron 이라는 실행파일이 존재하는지 여부만 확인을 한다. 있다면, 거기서 || 이후는 실행하지 않고 그냥 끝난다. 이렇게 확인해볼 수 있다.

test -x /usr/sbin/anacron || echo "있냐?"

위 명령 결과로, 아무런 출력도 볼 수 없다. 앞 부분이 False 일 경우에만 뒤 명령이 실행되기 때문이다.

test -x /usr/sbin/anacro || echo "있냐?"
있냐?

이런 식이다.

그러면 도대체, anacron 은 언제 실행되는건가??
anacron 은 anacron.timer 에 의해 매시간 실행되고, anacron.timer 가 실행하는 서비스는 anacron.service 이다.

$ sudo systemctl status anacron.timer    
● anacron.timer - Trigger anacron every hour
   Loaded: loaded (/lib/systemd/system/anacron.timer; enabled; vendor preset: en
   Active: active (waiting) since Wed 2020-05-17 10:34:17 KST; 5h 12min ago
  Trigger: Wed 2020-05-17 16:00:50 KST; 14min left

모든 정보가 여기에 다 나와있다.

  • anacron.time – Trigger anacron every hour : 매 시간 anaron 을 실행한다.
  • Active : 5h 12min ago : 5시간 12분 전에 최초 실행되었다. (시스템이 켜진 시각)
  • Trigger : 14 min left : 14 분 후에 다시 실행될 예정.

매 시간(대략 매시 2분 쯤 인듯?) anacron timer 가 실행되고, 그에 따라 ancron 도 실행된다.
이젠 anacron.service 를 보자.

$ sudo systemctl status anacron
● anacron.service - Run anacron jobs
   Loaded: loaded (/lib/systemd/system/anacron.service; enabled; vendor preset: enabled)
   Active: active (running) since Wed 2020-05-17 15:02:26 KST; 6s ago
     Docs: man:anacron
           man:anacrontab
 Main PID: 12757 (anacron)
    Tasks: 1 (limit: 2286)
   CGroup: /system.slice/anacron.service
           └─12757 /usr/sbin/anacron -dsq

May 17 15:02:26 newtest systemd[1]: Started Run anacron jobs.
May 17 15:02:26 newtest anacron[12757]: Anacron 2.3 started on 2020-05-17
May 17 15:02:26 newtest anacron[12757]: Will run job `cron.daily' in 5 min.
May 17 15:02:26 newtest anacron[12757]: Will run job `cron.weekly' in 10 min.
May 17 15:02:26 newtest anacron[12757]: Will run job `cron.monthly' in 15 min.
May 17 15:02:26 newtest anacron[12757]: Jobs will be executed sequentially

위 상황은 매번 나오지는 않는다. 평소엔 이렇게 나올 가능성이 높다.

$ sudo systemctl status anacron
[sudo] password for nemocomp: 
● anacron.service - Run anacron jobs
   Loaded: loaded (/lib/systemd/system/anacron.service; enabled; vendor preset: enabled)
   Active: inactive (dead) since Wed 2020-05-20 15:29:35 KST; 21min ago
     Docs: man:anacron
           man:anacrontab
  Process: 867 ExecStart=/usr/sbin/anacron -dsq (code=exited, status=0/SUCCESS)
 Main PID: 867 (code=exited, status=0/SUCCESS)

May 20 15:29:35 newtest systemd[1]: Started Run anacron jobs.
May 20 15:29:35 newtest anacron[867]: Anacron 2.3 started on 2020-05-17
May 20 15:29:35 newtest anacron[867]: Normal exit (0 jobs run)

두 결과의 차이는 anacron 이 작업을 실행했느냐 아니면 그냥 넘어갔느냐에 있다.

첫번째는 직접 작업을 시행한 경우다.
두번째는 anacron 은 실행되었으나(Anacron 2.3 started on 2020-05-17), 바로 Normal exit 로 빠져나갔다.

왜? 어떨 땐 하고 어떨 땐 안하는건가?

anacron 은, 언제 켜질지 모르는 시스템을 대상으로 한다. 따라서, 일단 시스템이 켜지면 anacron.timer 가 실행되고, 바로 anacron 을 호출하는 듯 하다. anacron.timer 는 systemd 에 사용가능하게 등록(enabled)되어 있으므로, 시스템 시동후 바로 실행된다.

anacron 이 실행되면, ‘기존에 미처 처리하지 못한 cron job‘ 이 있는지 확인한다.

기존에 미처 처리하지 못한 cron job이 있다면, 처리하면 되고, 이미 다 처리해서 처리할 내용이 없으면 아무 짓(?)도 안하고 그냥 끝낸다.
이게 매시각마다 anacron.timer 에 의해 반복된다.

그럼 여기서 의문이 생긴다.
기존에 미처 처리하지 못한 cron 작업‘이 있는지 여부는 어떻게 알까?

이를 위해, anacron 은 실행 될 때 timestamp 를 확인한다. 이 파일은 다음 디렉토리에 다음 파일로 저장되어 있다.

/var/spool/anacron/cron.daily
/var/spool/anacron/cron.monthly
/var/spool/anacron/cron.weekly

이 파일은 별 게 없고, 날짜만 찍혀있다.

cat cron.daily
20200517

Daily 작업의 경우를 예로 들면, anacron 의 진행 방식은 이렇다.

timestamp 를 오늘 날짜와 비교한다.
timestamp 가 어제라면, anacron 은 설정된 작업을 수행한다. (이게 위의 첫번째 예)
timestamp 가 오늘이라면, 더 이상 작업없이 그냥 넘겨버린다. (위의 두번째 예. Normal Exit)

Weekly 나 Monthly 일 경우도 마찬가지. 다만, 비교할 날짜가 ‘어제’가 아니고 이전 작업일이 되겠다. 아무튼, ‘오늘’이 아니면 작업을 시행한다.

그럼, 여기서 또 의문. systemd status anacron 에선 이런 문구를 출력했었다.

Will run job `cron.daily' in 5 min.
Will run job `cron.weekly' in 10 min.
Will run job `cron.monthly' in 15 min.

자, 또 의문 두가지. cron.daily 등은 위 cron 항목에서 얘기한 그 cron.daily 인가?
두번째 의문. 왜 daily 는 5 분 뒤, weekly 는 10 분 뒤, monthly 는 15 분 뒤에 실행되나? 이것도 어딘가에 설정이 정해져 있나?

그렇다. 그것도 명확하게.
이 부분에 대해선 다음 두 글에서 도움을 얻었다.

How To Schedule Routine Tasks With Cron and Anacron on a VPS

이 설정은 /etc/anacron 에 저장되어 있다.

# /etc/anacrontab: configuration file for anacron

# See anacron(8) and anacrontab(5) for details.

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
HOME=/root
LOGNAME=root

# These replace cron's entries
1	5	cron.daily	run-parts --report /etc/cron.daily
7	10	cron.weekly	run-parts --report /etc/cron.weekly
@monthly	15	cron.monthly	run-parts --report /etc/cron.monthly

/etc/crontab 과 유사한 형태인데, 뜻하는 바는 전혀 다르다. man anacrontab 으로 자세한 설명을 볼 수 있다. 대충 옮겨보자면 이렇다.

위의 1 5 cron.daily run-parts --report /etc/cron.daily 의 항목명(Field name?)은 이렇다.

period  delay  job-identifier  command

cron 에서 앞의 숫자 항목은 실행될 ‘시간’을 뜻했지만, 여기서 앞 숫자는 그렇질 않다.

  • 1 : 매일 실행해야 함을 의미.
  • 5 : anacron 이 실행되고 나서, 해당 명령(run-parts –report /etc/cron.daily) 이 언제 실행돼야할지 지정. 분 단위.
  • cron.daily : 이 작업의 제목. (슬래시와 공백을 제외하곤 아무 문자나 넣어도 된다. 한국어도 되려나?)
  • 나머지는 실행 명령

따라서, /etc/anacrontab 의 첫번째 명령은, ‘매일 실행되어야 하며, anacron 이 실행되고 난 뒤 5분 뒤에 해당명령(run-parts)를 실행해야 하고, 이 작업의 이름은 cron.daily 라 명명한다.’ 라고 해석할 수 있다.

그리고, 이 이름, cron.daily 는 위에 말했던 타임스탬프가 찍히는 파일명(/var/spool/anacron/cron.daily)과 동일하다.

이제 모든 의문이 풀렸다. systemctl status anacron.service 에서 볼 수 있었던 문구.

Will run job `cron.daily' in 5 min.
Will run job `cron.weekly' in 10 min.
Will run job `cron.monthly' in 15 min.

이게 왜 5분, 10분 15분이었는지? 이 시간은 /etc/anacrontab 에 지정이 되어 있었다.

최종 정리 : cron 에서 시작, anacron 으로 끝나는 작업.

그럼, 실제 예를 들어서 어떻게 작업이 진행되는지 알아보겠다.

먼저 매일 실행되는 작업이 필요하다고 한다. 매일 실행되어야 하므로, /etc/cron.daily 에 스크립트를 만든다. (물론, 개인 crontab 을 써도 된다.)

이름은 test_cron 으로 주고, chmod +x 로 실행가능하게 만들어야 한다.

#!/bin/sh

echo $(/bin/date +\%Y\%m\%d-\%H\%M) >> /home/userid/cron_test_timestamps.txt

exit 0

그냥, 프로그램이 실행된 날짜와 시간만을 계속 저장해주는 스크립트.

이 스크립트는 매일 실행이 되는데, 원래대로라면 /etc/crontab 에 지정된 오전 6:25 에 실행되어야 한다.

25 6	* * *	root	test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )

그러나, 그 시간엔 자고 있었다. 따라서 crontab 은 물건너 갔나?
어차피 crontab 은 anacron 으로 책임을 넘겼으므로, 아무 작업도 하지 않는다.
이젠 anacron 이 행동을 보여줄 시기가 됐다.

PC 를 켠 시간은 오후 4:30. 그리고 PC 는 어제도 켰었다.
따라서, 어제 날짜의 timestamp 가 /var/spool/anacron/cron.daily 에 찍혀있다. (예를 들어 20200516)

시험을 해보기 위해 스크립트를 만들고, 실행가능하게 만든 뒤, /var/spool/anacron/cron.daily 를 확인해본다. 만약 이 날짜가 오늘이라면, 이전 날짜로 바꾼다. 어제나 그제나, 10년 전이나.. 아무튼 오늘보다 이전 날짜로.

systemctl status anacron.timer anacron
● anacron.timer - Trigger anacron every hour
   Loaded: loaded (/lib/systemd/system/anacron.timer; enabled; vendor preset: enabled)
   Active: active (waiting) since Wed 2020-05-17 15:29:35 KST; 1h 4min ago
  Trigger: Wed 2020-05-17 17:00:06 KST; 26min left

May 20 15:29:35 newtest systemd[1]: Started Trigger anacron every hour.

● anacron.service - Run anacron jobs
   Loaded: loaded (/lib/systemd/system/anacron.service; enabled; vendor preset: enabled)
   Active: inactive (dead) since Wed 2020-05-17 16:01:55 KST; 31min ago
     Docs: man:anacron
           man:anacrontab
  Process: 1672 ExecStart=/usr/sbin/anacron -dsq (code=exited, status=0/SUCCESS)
 Main PID: 1672 (code=exited, status=0/SUCCESS)

May 17 16:01:55 newtest systemd[1]: Started Run anacron jobs.
May 17 16:01:55 newtest anacron[1672]: Anacron 2.3 started on 2020-05-17
May 17 16:01:55 newtest anacron[1672]: Normal exit (0 jobs run)

이 정보를 보면, 이제 26 분 뒤 anacron timer 가 작동할 예정이다. 그리고 timer 는 anacron 을 기동시킨다.
anacron 은 일단 cron.daily 의 timestamp 를 확인한다. 이게 오늘 날짜라면 이미 작업을 수행했다는 의미가 되므로, 아무 일없이 작업은 종료된다.

만약, 오늘보다 이전 날짜라면, cron.daily 는 수행된 적이 없다는 뜻이므로, /etc/anacron 에 설정된 명령, run-parts –report /etc/cron.daily 을 실행한다.

anacron 은 부팅 시에 실행되고, 그 이후 매 시간마다 실행되어 못다한 cron 작업을 수행한다. 따라서, 사실 /etc/crontab 에 설정된 시간은 anacron 이 설치되어 있다면 크게 의미가 없다.

바꿔 말하면, anacron 이 설치되어 있다면, crontab 에 설정한 시간에 지정된 작업이 이뤄지지 않을 가능성이 높다. 최대 1시간 정도 차이가 날 수 있다.
예를 들어, anacron 이 11:02 에 실행되었고, crontab 이 지정된 시간은 11:05 였다면, 다음 anacron 이 실행될 12:02 로 작업이 이관되기 때문이다.

여기서 또 한가지!
만약 crontab 의 작업은 밤 11 시로 설정되었고, PC 를 켠 시각이 오후 2시라면? 그 날의 cron.daily 는 언제 실행되는걸까? 켠 시작에 실행되나?
-> 켠 시각에 시작된다. 밤 11시까지 기다릴 ‘논리의 근거’가 없다.
왜냐고? anacron 은 PC 가 켜지면 바로 기동되고, 기동되면 cron job 을 바로 수행하므로, /etc/crontab 에 명기된 시간과는 관계없이 작동한다. (이 내용은 이 글 초반에 이미 써놨다.)

자.. 다시 돌아와서, 이제 문제의 시각이 됐다.

# systemctl status anacron
● anacron.service - Run anacron jobs
   Loaded: loaded (/lib/systemd/system/anacron.service; enabled; vendor preset: enabled)
   Active: active (running) since Wed 2020-05-17 17:00:22 KST; 26s ago
     Docs: man:anacron
           man:anacrontab
 Main PID: 1803 (anacron)
    Tasks: 1 (limit: 2286)
   CGroup: /system.slice/anacron.service
           └─1803 /usr/sbin/anacron -dsq

May 17 17:00:22 newtest systemd[1]: Started Run anacron jobs.
May 17 17:00:22 newtest anacron[1803]: Anacron 2.3 started on 2017-05-17
May 17 17:00:22 newtest anacron[1803]: Will run job `cron.daily' in 5 min.
May 17 17:00:22 newtest anacron[1803]: Jobs will be executed sequentially

cron.weekly 와 cron.monthly 는 더 이상 할 작업이 없으므로 아무런 언급이 없고, cron.daily 는 타임스탬프가 어제 날짜로 찍혀있으므로, 오늘은 작업을 안했음을 인식하여, 5분 뒤에 작업이 이뤄진다는 문구를 보냈다. 이 5 분은 /etc/anacron 에 있는 바로 그 5분이다.

이제 5분 뒤면, ~/cron_test_timestapms.txt 가 생긴다.
생겼을까?

$ ls ~/cron_test_timestapms.txt
-rw-r--r-- 1 root     root         14 May 17 17:05 cron_test_timestapms.txt

$ cat ~/cron_test_timestapms.txt
20200517-1705

정확하다. 물론 /var/spool/anacron/cron.daily 의 타임스탬프는 오늘로 바뀌었다.

이걸로 모든 의문이 풀렸고, 둘 간 상관관계를 이해할 수 있게 됐다.
나름 보람 있는 작업이었어.

안녕하세요. 글 남겨주셔서 고맙습니다.