====== 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]]