====== anacron ======
* [[https://linux.die.net/man/8/anacron|anacron(8): runs commands periodically - Linux man page]]
* [[linux:cron|cron]] 은 상시 전원이 들어와 있는 시스템(서버)용에 적합하며, daemon 으로 떠서 특정 시간에 job 을 실행하는 역할이라면,
* anacron 은 daemon으로 뜨지는 않고 가끔씩 끄기도 하는 데스크탑 등에서, 스케줄링된 job 에 대해 전원이 켜지면 실행을 보장해주는 역할을 한다.
* 최대 실행 빈도는 1일 1회까지만 가능하다.
* **실행 시간을 완전히 특정할 수 없다.**
* [[linux:ubuntu|Ubuntu Linux]]의 경우 Desktop 배포판은 anacron이 깔리고, Server 배포판은 안깔린다. Server 는 기본적으로 상시 실행을 가정하기 때문이다.
* Desktop 배포판은 ''/etc/cron.{daily,weekly,monthly}'' 에 지정된 job 들이 anacron 을 통해 실행되게 돼 있어서, 해당 job들은 PC가 꺼져도 다시 켜진뒤에 job 실행이 보장된다(**hourly**는 워낙 자주 실행되므로 제외).
===== 특정 사용자로 재실행하기 =====
* [[https://askubuntu.com/|anacron - Run /etc/cron.daily from specific user - Ask Ubuntu]]
* **해당 cron 파일은 실행 권한이 지정된 user 에게도 주어져야 한다.** (모르면 그냥 `0755` 로 설정?)
#!/bin/sh
# If started as root, then re-start as user "gavenkoa":
if [ "$(id -u)" -eq 0 ]; then # root는 id가 0
exec sudo -H -u gavenkoa $0 "$@" # 핵심부.
echo "This is never reached.";
fi
echo "This runs as user $(id -un)";
# prints "gavenkoa"
exit 0;
* 그냥 다른 방법으로 cron shell 안에서 ''sudo -u ''로 명령을 실행하는 것도..
#!/bin/sh
sudo -u kwon37xi echo "This runs as user $(id -un)";
exit 0;
===== Logging =====
* anacron cron job 내의 system output 은 제대로 확인할 수 없다.
* 스크립트 내에서 [[linux:bash|Bash]] 파이프를 이용하거나 [[linux:syslog|Linux syslog]] 를 사용한다.
# /var/log/syslog 로 남기기
somecmd 2>&1 | logger -i
===== 참조 =====
* [[https://www.nemonein.xyz/2020/05/3778/|꽃삽질 : cron 과 anacron. 과연 둘은 친한 사이일까?]] : anacron 의 작동 원리를 잘 분석해두었다.
* [[https://www.tecmint.com/cron-vs-anacron-schedule-jobs-using-anacron-on-linux/|Cron Vs Anacron: How to Schedule Jobs Using Anacron on Linux]]
* [[https://www.digitalocean.com/community/tutorials/how-to-schedule-routine-tasks-with-cron-and-anacron-on-a-vps|How To Schedule Routine Tasks With Cron and Anacron on a VPS | DigitalOcean]]