áá»á±á¬áºááœáŸááºááœááºáá¬áá®áá»á¬ážááᯠáááŒáá·áºááᯠááá¹ááááºá áá±ážáá¬ážáá²á·áááºá ááá¯áá±á¬ááá¯ááºážá¡áá»áááºáá»á¬ážááœáẠáááá¯ááááºáá¬áá»á¬ážáá±á¬ Unix áááŸáááŒáá±á¬áºáááºáž ááá±á·áá±áẠáááá¯ááááºáá¬áá»á¬ážááẠáá±áá»á¬á áœá¬áááá«áááº- cron ááẠáááºážááá¯á·á¡á á¬áž á¡áá»áááºááᯠááŒá±áá¬áá¶áá«áááºá
Command Line utilities ááœá±á áá»áœááºáá±á¬á·áºá¡ááœáẠá¡á¬ážáááºážáá»ááºáá áºáá¯ááŒá áºáááᯠsedá awká wcá cut ááŸáá·áº á¡ááŒá¬ážáá±á¬ áááá¯ááááºáá±á¬ááºážáá»á¬ážááᯠáá»áœááºá¯ááºááá¯á·ááá¬áá¬áá»á¬ážáá±á«áºááœáẠáá±á·á áẠscript áá»á¬ážááŒáá·áº áá¯ááºáá±á¬ááºáá«áááºá áááºážááá¯á·áá²á០á¡áá»á¬ážá¡ááŒá¬ážááᯠcron á¡ááœáẠá¡áá¯ááºáá»á¬ážá¡ááŒá Ạáá®ááá¯ááºážáá¯ááºáá¬ážááŒá®áž 70s áá»á¬ážá០á¡á ááŒá¯áá±á¬ á¡áá»áááºááá¬ážáá±ážááœá²áá°ááŒá áºáááºá
áá« cron ááᯠá¡áá±á«áºáá¶á¡á¬ážááŒáá·áº á¡áá»áááºá¡áá±á¬áºááŒá¬á¡á±á¬áẠá¡áá±ážá áááºááá±á¬áºááŒáá¬ážáá²á áá«áá±ááá·áº áá áºáá±á·ááŸá¬ script áá áºáá¯ááᯠrun áá²á·á¡áá« error áá áºáá¯ááœá±á·ááá¯á· áá±áá»á¬ááŒáá·áºááá¯á· áá¯á¶ážááŒááºááá¯ááºáááºá á€áá±á¬ááºážáá«ážáá±á«áºáá¬áá¯á¶á áááºážááá¯áá±ážáá±á ááºááœáẠáá°ááŒáá¯ááºáá»á¬ážáá±á¬ Linux ááŒáá·áºáá±ááŸá¯áá»á¬ážááœáẠá¡ááá cron ááœá±ážáá»ááºááŸá¯áá»á¬ážááŸáá·áº áááºážááá¯á·á¡áá»áá¯á·á ááœá²á·á ááºážáá¯á¶ááŸáá·áº áááºážááŸá®ážáá¬áá²á·áááºá
áááºááẠLinux ááá¯á¡áá¯á¶ážááŒá¯ááŒá®áž cron á¡áá¯ááºáá»á¬ážááᯠáá¯ááºáá±á¬ááºáá±áá«ááá¬ážá Unix ááœáẠsystem application architecture ááᯠáááºá áááºáááºá á¬ážáá«ááá¬ážá ááŒá®ážááẠáá«ááá¯á·ááœá¬ážáááºá
á¡ááŒá±á¬ááºážá¡áá¬
áá»áá¯ážá áááºáá»á¬ážááá°áá¡á POSIX crontab áá±á¬ááºážá¡á¬ážá¡áá±á¬ááºážáá¯á¶áž - Vixie cron 3.0pl1 Debian ááŸáá·áº Ubuntu ááœáẠcron Red Hatá Fedora ááŸáá·áº CentOS ááœáẠáááá¯áá® SLES ááŸáá·áº openSUSE ááŸá áááá¯áá® Vixie cron áááááᬠafterword
áá»áá¯ážá áááºáá»á¬ážááá°áá¡á
á¡áá¯á¶ážááŒá¯áá° ááá¯á·ááá¯áẠá áá áºáááá¯ááááºáá»á¬ážááᯠá¡áá»áááºá¡áá«á¡ááá¯áẠáá¯ááºáá±á¬ááºááŒááºážááẠáááºáááºááŸá¯á áá áºá¡á¬ážáá¯á¶ážááœáẠáááá¬áááºááŸá¬ážáá±á¬ ááá¯á¡ááºáá»ááºáá áºáá¯ááŒá áºáááºá ááá¯á·ááŒá±á¬áá·áºá áááá¯ááááºáá¬áá»á¬ážááẠá¡áá»áááºááŒá¬ááŒáá·áºá áœá¬ááááºážá áááºážááá¯á·á¡á¬áž áááá¯á០á¡á á®á¡á ááºááœá²ááŒá®áž áá¯ááºáá±á¬ááºááá¯ááºá á±ááá·áº áááºáá±á¬ááºááŸá¯áá»á¬áž ááá¯á¡ááºááŒá±á¬ááºáž ááá±á¬áá±á«ááºáá²á·ááŒáááºá
Unix áá²á·ááá¯á·áá±á¬ áááºáááºááŸá¯á áá áºáá»á¬ážááẠáá»á±á¬áºááŒá¬ážáá±á¬ Ken Thompson á¡áá«á¡ááẠááŒá®ážáá²á·áá±á¬áá¬á á¯ááŸá Ạ7 áá¯ááŸá áºáá»á¬ážá¡ááœááºáž Bell Labs ááœáẠáá®ááœááºáá²á·ááá·áº Version 70 Unix ááá¯á· ááŒááºáááºááŒá±áá¬áá¶áááºá áá¬ážááŸááºáž 7 Unix ááœáẠáá¯á¶ááŸáẠsuperuser áá¯ááºáá±á¬ááºá áá¬áá»á¬áž áá¯ááºáá±á¬ááºáááºá¡ááœáẠcron áááºáá±á¬ááºááŸá¯áááºáž áá«áááºáá«áááºá
áá¯á¶ááŸááºáá±ááºáá® cron ááẠááá¯ážááŸááºážáá±á¬áááá¯ááááºáá áºáá¯ááŒá áºáá±á¬áºáááºáž áá°áááºážáá¬ážááŸááºážááááºáááºááŸá¯ algorithm ááẠááá¯ááááºááá¯ážááŸááºážáá«áááº- áááºáá±á¬ááºááŸá¯ááẠáá áºáááá áºáá»áŸááºáá áºááŒáááºááá¯ážáá¬ááŒá®áž ááá¯ááºáá áºáá¯áááºáž (/etc/lib/crontab) á០áá¯ááºáá±á¬ááºá áá¬áá»á¬ážáá«ááá·áº ááá¬ážááá¯áááºááŒá®áž áááºážá¡ááœáẠáá¯ááºáá±á¬ááºáááºá áááºááŸáá¡ááá¯ááºá¡ááá·áºááœáẠáá¯ááºáá±á¬ááºááá·áºááá·áº á¡áá¯ááºáá»á¬ážááᯠsuperuser áá¯ááºáá«á
áá±á¬ááºááá¯ááºážááœááºá ááá¯ážááŸááºážááŒá®áž á¡áá¯á¶ážáááºáá±á¬ áááºáá±á¬ááºááŸá¯á ááá¯ááá¯áá±á¬ááºážááœááºáá±á¬áá¬ážááŸááºážáá»á¬ážááᯠUnix áá²á·ááá¯á·áá±á¬ áááºáááºááŸá¯á áá áºáá»á¬ážá¡á¬ážáá¯á¶ážááœáẠáá¶á·ááá¯ážáá±ážáá²á·áá«áááºá
crontab áá±á¬áºáááºá áá±áá°áá»áá±á¬áºááŒáá»ááºáá»á¬ážááŸáá·áº utility ááá¯ááºáá±á¬ááºáá»ááºáá»á¬ážá á¡ááŒá±áá¶áá°áá»á¬ážááẠUnix-like operating systems - POSIX - 1992 ááœáẠááá·áºááœááºážáá²á·ááŒá®ážá ááá¯á·ááŒá±á¬áá·áº de facto standard á០cron ááẠde jure standard ááŒá áºáá¬áá²á·áááºá
1987 áá¯ááŸá áºááœáẠPaul Vixie ááẠUnix á¡áá¯á¶ážááŒá¯áá°áá»á¬áž cron á¡ááœáẠáááºážááá¯á·áááá¹ááá»á¬ážááᯠá á áºáááºážáá±á¬ááºáá°ááŒá®ážáá±á¬áẠááá¯ážáᬠcron á ááŒá¿áá¬á¡áá»áá¯á·ááᯠááŒá¯ááŒááºáá±ážáᬠááá¬ážááá¯ááºáá»á¬ážá syntax ááᯠáá»á²á·ááœááºááá·áº daemon á áá±á¬ááºáááºáá¬ážááŸááºážááᯠáá¯ááºááŒááºáá²á·áááºá
Vixie cron ááááááá¬ážááŸááºážááœáẠPOSIX ááá¯á¡ááºáá»ááºáá»á¬ážááŸáá·áº ááŒáá·áºáá®áá±á¬á·áááºá ááá¯á·á¡ááŒááºá áááá¯ááááºááœáẠáá áºááááºááá¯ááºá ááºáá áºáá¯ááŸááááºá ááá¯á·ááá¯áẠREADME ááŸáááá¹ááá»á¬ážááŸááœá²á áá¯á¶ážáááá¯ááºá ááºáááŸááá«- á á¬áá±ážáá°á á¡á¬ááá¶ááá±ážáá«á á á¬áá±ážáá°á¡áááºá áá»ááºááááá«á áááá¯ááááºááᯠá¡áááºážá¡ááŒá áºáá¯ááºááŒáá·áºáᬠáá±á¬ááºážáá»ááá¯ááºáááºá á€ááá¯á¡ááºáá»ááºáá»á¬ážááẠááá¯ááŸá áºáá»á¬ážá¡ááœááºáž áá°ááŒáá¯ááºáá»á¬ážáá¬áá±áá±á¬ á¡ááá²á·áá±á¬á·ááºáá²á á¡ááŒá±áá¶ááá±á¬ááá¬ážáá»á¬ážááŸáá·áº áááá¬áááŒá áºáá¬áá²á·áá±á¬ááŒá±á¬áá·áº 90s á¡á á±á¬ááá¯ááºážááœááºááœá±á·ááá±á¬ á¡ááá Linux ááŒáá·áºááŒá°ážááŸá¯á¡áá»áá¯á·ááẠVixie cron ááᯠáááºážááá¯á·áá áá áºáá áºáá¯á¡ááŒá Ạáááºáá¶áá²á·ááŒá®áž ááá±á·á¡áá áááºáááºáá¯ááºáá±á¬ááºáá±áá²ááŒá áºáááºá
á¡áá°ážáááŒáá·áºá Red Hat ááŸáá·áº SUSE ááá¯á·ááẠVixie cron - cronie ááááºážáá¯á¶áááºážááœááᯠáá®ááœááºáá²á·ááŒá®áž Debian ááŸáá·áº Ubuntu ááá¯á·ááẠáá¬áá±ážáá»á¬ážá áœá¬ááŒáá·áº Vixie cron á áá°áááºážáá¯ááºáá±ááŸá¯ááᯠá¡áá¯á¶ážááŒá¯áááºá
POSIX ááœááºáá±á¬áºááŒáá¬ážáá±á¬á¡áá¯á¶ážááŒá¯áá°á utility crontab ááᯠáŠážá áœá¬áááºážááŸá®ážááŒáá«á áá¯á·á ááá¯á·áá±á¬áẠVixie cron ááœááºáá±ážáá¬ážáá±á¬ syntax extension áá»á¬ážááŸáá·áºáá°ááŒáá¯ááºáá»á¬ážáá±á¬ Linux ááŒáá·áºáá±ááŸá¯áá»á¬ážááœáẠVixie cron ááá¯á¶á á¶ááœá²áá»á¬ážá¡áá¯á¶ážááŒá¯ááŸá¯ááᯠáá»áœááºá¯ááºááá¯á·ááŒáá·áºááŸá¯áá«áááºá áá±á¬ááºáá¯á¶ážá¡áá±ááŸáá·áºá ááááºáá¯áá·áºáá±á«áºááŸááá»ááºáá®ááẠcron daemon áááááá¬áááœá²ááŒááºážá áááºááŒá¬ááŸá¯ááŒá áºáááºá
POSIX crontab
áá°áááºáž cron ááẠsuperuser á¡ááœáẠá¡ááŒá²á¡áá¯ááºáá¯ááºáá±áá«áá áá±ááºáá®á¡áá»áááºááá¬ážáá»á¬ážááẠáá¬áá¬ááºá¡áá¯á¶ážááŒá¯áá°áá»á¬ážá áá¯ááºáááºážáá±á¬ááºáá¬áá»á¬ážááᯠáá¯ááºáá±á¬ááºáá±á·ááŸáááŒá®áž ááá¯ááá¯áá¯á¶ááŒá¯á¶ááŒá®áž á¡áááºááŒá±áááºá
Crons ááᯠáááá¯ááááºááŸá áºáá¯áá¡á á¯áá áºáá¯á¡áá±ááŒáá·áº áá±á¬ááºáá¶á·áá±ážáááº- á¡áááºáááŒááºáááºáááºáá±áá±á¬ cron daemon ááŸáá·áº áá¯á¶ážá áœá²áá°áá»á¬ážá¡ááœááºáááŸáááá¯ááºáá±á¬ crontab utilityá daemon ááẠá¡áá¯á¶ážááŒá¯áá°ááŸáá·áº á áá áºááá¬ážáá»á¬ážá០áá¯ááºáá±á¬ááºá áá¬áá»á¬ážááᯠá áááºáá¯ááºáá±á¬ááºáá±áá»áááºááœáẠá áá áºá¡ááœááºážááŸá áá¯á¶ážá áœá²áá°áá áºáŠážá á®á¡ááœáẠáá®ážááŒá¬ážáá¯ááºáá±á¬ááºá áá¬ááá¬ážáá»á¬ážááᯠáááºážááŒááºááá¯ááºá á±áááºááŒá áºáááºá
Ð
crontab utility ááá¯áá±á«áºááá¯ááŒááºážááŒáá·áº áááºááẠá¡áá¬áá±ážáá¯ááᯠáá¯ááºáá±á¬ááºááá¯ááºáááº- áááºážááŒááºáá°ááŸá á¡áá¯á¶ážááŒá¯áá°ááá¯ááºáááºážáá±á¬ááºáá¬ááá¬ážááᯠáááºážááŒááºáááºá ááá¯ááºáá áºáá¯ááŸááá¬ážááᯠáááºáááºá áááºááŸááá¯ááºáá±á¬ááºá áá¬ááá¬ážááᯠááŒááááºááŸáá·áº á¡áá¯ááºááá¬ážááᯠááŸááºážáááºážáá«á crontab utility áá¡áá¯ááºáá¯ááºáá¯á¶á¥ááá¬áá»á¬áž-
crontab -e # ÑеЎакÑОÑПваÑÑ ÑаблОÑÑ Ð·Ð°ÐŽÐ°Ñ
crontab -l # пПказаÑÑ ÑаблОÑÑ Ð·Ð°ÐŽÐ°Ñ
crontab -r # ÑЎалОÑÑ ÑаблОÑÑ Ð·Ð°ÐŽÐ°Ñ
crontab path/to/file.crontab # загÑÑзОÑÑ ÑаблОÑÑ Ð·Ð°ÐŽÐ°Ñ ÐžÐ· Ñайла
áá±á«áºáá²á·á¡áá« crontab -e
standard environment variable ááœáẠáááºááŸááºáá¬ážáá±á¬ áááºážááŒááºáá°ááᯠá¡áá¯á¶ážááŒá¯áá«áááºá EDITOR
.
á¡áá¯ááºáá»á¬ážááᯠáááºážááá¯á·ááá¯ááºááá¯áẠá¡á±á¬ááºáá«áá±á¬áºáááºáá»á¬ážááŒáá·áº áá±á¬áºááŒáá¬ážáá«áááºá
# ÑÑÑПкО-кПЌЌеМÑаÑОО ОгМПÑОÑÑÑÑÑÑ
#
# заЎаÑа, вÑпПлМÑÐµÐŒÐ°Ñ ÐµÐ¶ÐµÐŒÐžÐœÑÑМП
* * * * * /path/to/exec -a -b -c
# заЎаÑа, вÑпПлМÑÐµÐŒÐ°Ñ ÐœÐ° 10-й ЌОМÑÑе кажЎПгП ÑаÑа
10 * * * * /path/to/exec -a -b -c
# заЎаÑа, вÑпПлМÑÐµÐŒÐ°Ñ ÐœÐ° 10-й ЌОМÑÑе вÑПÑПгП ÑаÑа кажЎПгП ÐŽÐœÑ Ðž ОÑпПлÑзÑÑÑÐ°Ñ Ð¿ÐµÑеМапÑавлеМОе ÑÑаМЎаÑÑМПгП пПÑПка вÑвПЎа
10 2 * * * /path/to/exec -a -b -c > /tmp/cron-job-output.log
ááŸááºáááºážáá»á¬ážá ááááááºáááºáá«ážáá¯- áááá Ạ[1..60]á áá¬áá® [0..23]á áááááºáá»á¬áž [1..31]á á [1..12]á áááºááá¹ááááºááááºáá»á¬áž [0. .á] áááºááŒá¯áá¬á ááááºá¹áááœá±á áá±á¬ááºáá¯á¶ážá ááá¹ááá á¡ááœááºááẠá á¶á¡áááá·áºáá±ážá áá¬ážááŒááºááŒáá·áº áá¯ááºáá±á¬ááºááá·áº ááá¯ááºážáá áºáá¯ááŒá áºáááºá
áááá¡ááœááºáá«ážááœááºááœáẠáááºááá¯ážáá»á¬ážááᯠáá±á¬áºáá¬áá»á¬ážááŒáá·áº ááœá²ááŒá¬ážáá±á¬áºááŒááá¯ááºáááº-
# заЎаÑа, вÑпПлМÑÐµÐŒÐ°Ñ Ð² пеÑвÑÑ Ðž ЎеÑÑÑÑÑ ÐŒÐžÐœÑÑÑ ÐºÐ°Ð¶ÐŽÐŸÐ³ÐŸ ÑаÑа
1,10 * * * * /path/to/exec -a -b -c
ááá¯á·ááá¯áẠáá¯á¶ážááá¯ááŒáá·áº-
# заЎаÑа, вÑпПлМÑÐµÐŒÐ°Ñ Ð² кажЎÑÑ ÐžÐ· пеÑвÑÑ
ЎеÑÑÑО ЌОМÑÑ ÐºÐ°Ð¶ÐŽÐŸÐ³ÐŸ ÑаÑа
0-9 * * * * /path/to/exec -a -b -c
áá¯ááºáá±á¬ááºá áá¬á¡áá»áááºááá¬ážááœá²ááŒááºážááá¯á· á¡áá¯á¶ážááŒá¯áá°áááºáá±á¬ááºááœáá·áºááᯠcron.allow ááŸáá·áº cron.deny ááá¯ááºáá»á¬ážá POSIX ááœáẠááááºážáá»á¯ááºáá¬ážááŒá®ážá áááºážááẠcrontab ááá¯á·áááºáá±á¬ááºááœáá·áºááŸááá±á¬á¡áá¯á¶ážááŒá¯áá°áá»á¬ážá á¬áááºážááœááºážááŒááºážááŸáá·áº áááá¯ááááºááá¯áááºáá±á¬ááºááœáá·áºáááŸááá²á¡áá¯á¶ážááŒá¯áá°áá»á¬ážá¡áá®ážáá®ážááŸáááŒáááºá á á¶ááŸá¯ááºážááẠá€ááá¯ááºáá»á¬ážááááºáá±áá¬ááᯠáááºááá·áºáááºážááŒáá·áºáá»áŸ ááááºážááŸáááá¬ážáá±á
á á¶ááŸá¯ááºážá¡áá á¡áááºážáá¯á¶áž áááºáááºážáá»áẠááááºážááŸáẠáá±ážáá¯ááᯠá áááºáá±á¬ááºááœááºááá·áº áááá¯ááááºáá»á¬ážááá¯á· áá»á±á¬áºááŒááºááááº-
- HOME - á¡áá¯á¶ážááŒá¯áá°á áááºááááºážááœáŸááºá
- LOGNAME â á¡áá¯á¶ážááŒá¯áá° áá±á¬á·ááºá¡ááºá
- PATH ááẠstandard system utilities áá»á¬ážááᯠáááºááŸá¬ááœá±ááá¯ááºááá·áº áááºážááŒá±á¬ááºážááŒá áºáááºá
- SHELL â áá¯á¶ážáá¬ážáá±á¬ command á áá¬ážááŒááºááá¯á· áááºážááŒá±á¬ááºážá
ááŸááºáá¬ážá áá¬ááŸá¬ POSIX ááẠá€ááááºážááŸááºáá»á¬ážá¡ááœáẠáááºááá¯ážáá»á¬áž áááºááá·áºáá±áá¬á០áá¬áááºááŸáá·áº áááºáááºá áá¬á០áááŒá±á¬áá«á
áá±á¬ááºážá¡á¬ážá¡áá±á¬ááºážáá¯á¶áž - Vixie cron 3.0pl1
áá°ááŒáá¯ááºáá»á¬ážáá±á¬ cron áá»áá¯ážááœá²áá»á¬ážá áá¯á¶ááá¯ážáá±ážááŸá¬ Vixie cron 3.0pl1 ááŒá áºááŒá®áž 1992 áá¯ááŸá áºááœáẠcomp.sources.unix á á¬ááá¯á·á á¬áááºážááœáẠááááºáááºáá²á·áááºá áá»áœááºá¯ááºááá¯á·ááẠá€áá¬ážááŸááºážá á¡áááá¡ááºá¹áá«áááºáá»á¬ážááᯠááá¯ááá¯á¡áá±ážá áááºáá¯á¶ážáááºáá«áááºá
Vixie cron ááẠáááá¯ááááºááŸá áºáᯠ(cron ááŸáá·áº crontab) ááŒáá·áº áá¬áááºá áá¯á¶ááŸááºá¡ááá¯ááºážá daemon ááẠsystem task table ááŸáá·áº user áá áºáŠážáá»ááºážá á®á task tables ááŸáá¯ááºáá±á¬ááºá áá¬áá»á¬ážááá¯áááºááŸá¯ááŒááºážááŸáá·áºáá¯ááºáá±á¬ááºááŒááºážá¡ááœááºáá¬áááºááŸáááŒá®áž crontab utility áááºá¡áá¯á¶ážááŒá¯áá°ááá¬ážáá»á¬ážááá¯áááºážááŒááºáááºáá¬áááºááŸááááºá
Task table ááŸáá·áº configuration ááá¯ááºáá»á¬áž
superuser task table ááẠ/etc/crontab ááœááºáááºááŸááááºá á áá áºááá¬ážá syntax ááẠVixie cron á syntax ááŸáá·áº áááºááá¯ááºááŒá®ážá áááºážááœááºááŸááá±á¬ ááá¹áááá±á¬áºáá¶ááẠáá¯ááºáá±á¬ááºá áá¬ááᯠá áááºáá¯ááºáá±á¬ááºááá·áºá¡áá¯á¶ážááŒá¯áá°áá¡áááºááᯠáá±á¬áºááŒááŒááºážááŸááœá²á
# ÐапÑÑкаеÑÑÑ ÐµÐ¶ÐµÐŒÐžÐœÑÑМП ÐŸÑ Ð¿ÐŸÐ»ÑзПваÑÐµÐ»Ñ vlad
* * * * * vlad /path/to/exec
áá¯á¶ááŸááºá¡áá¯á¶ážááŒá¯áá°áá¯ááºáááºážáá±á¬ááºáá¬ááá¬ážáá»á¬ážááᯠ/var/cron/tabs/username ááœáẠáááºááŸáááŒá®áž áá°áá®áá±á¬ syntax ááá¯á¡áá¯á¶ážááŒá¯áá«á áááºá¡áá¯á¶ážááŒá¯áá°áá áºáŠážá¡áá±ááŒáá·áº crontab utility ááá¯ááœáá·áºáá±á¬á¡áá«á á€á¡áá¬áá»á¬ážááẠáááºážááŒááºáá¬ážááá·áºááá¯ááºáá»á¬ážááŒá áºáááºá
crontab ááá¯á·áááºáá±á¬ááºááœáá·áºááŸááá±á¬á¡áá¯á¶ážááŒá¯áá°áá»á¬ážá á¬áááºážáá»á¬ážááᯠ/var/cron/allow ááŸáá·áº /var/cron/deny ááá¯ááºáá»á¬ážááœáẠá á®áá¶áá¬ážááŒá®ážá áááºááẠáá®ážááŒá¬ážá á¬ááŒá±á¬ááºážáá áºáá¯ááœáẠá¡áá¯á¶ážááŒá¯áá°á¡áááºááá¯ááá·áºáááºáá¬ááá¯áááºá
ááá¯ážáá»á²á·áá¬ážáá±á¬ á¡áá¬ážá¡ááá¯
POSIX crontab ááŸáá·áº ááŸáá¯ááºážááŸááºáá«á Paul Vixey áááŒá±ááŸááºážáá»ááºááœáẠutility ááá¯ááºáááºážáá±á¬ááºáá¬ááá¬ážáá»á¬ážá syntax á¡ááœáẠá¡ááœááºá¡áá¯á¶ážáááºáá±á¬ ááŒá¯ááŒááºááœááºážáá¶ááŸá¯áá»á¬ážáá«ááŸááááºá
ááá¬ážá¡áá¬ážá¡ááá¯á¡áá áºáá áºáᯠáááá¯ááºáá«ááŒá®- á¥ááá¬á áááºááẠá¡áááºááŒáá·áº áááºááá¹ááááºá áááºáá»á¬áž ááá¯á·ááá¯áẠááá»á¬ážááᯠ(ááááºá¹áá¬áá±á·á á¡ááºá¹áá«áá±á· á áááºááá¯á·ááŒáá·áº áááºááŸááºááá¯ááºáááº)á
# ÐапÑÑкаеÑÑÑ ÐµÐ¶ÐµÐŒÐžÐœÑÑМП пП пПМеЎелÑМОкаЌ О вÑПÑМОкаЌ в ÑМваÑе
* * * Jan Mon,Tue /path/to/exec
áááºááá·áºá¡áá¯ááºáá»á¬ážááᯠá áááºáá¯ááºáá±á¬ááºááá·áºá¡ááá·áºááᯠáááºáááºááŸááºááá¯ááºáááº-
# ÐапÑÑкаеÑÑÑ Ñ ÑагПЌ в Ўве ЌОМÑÑÑ
*/2 * * * Mon,Tue /path/to/exec
á¡ááá·áºáá»á¬ážááŸáá·áº ááŒá¬ážáá¬ááá»á¬ážááᯠáá±á¬á ááºááá¯ááºáááºá
# ÐапÑÑкаеÑÑÑ Ñ ÑагПЌ в Ўве ЌОМÑÑÑ Ð² пеÑвÑÑ
ЎеÑÑÑÑ ÐŒÐžÐœÑÑ ÐºÐ°Ð¶ÐŽÐŸÐ³ÐŸ ÑаÑа
0-10/2 * * * * /path/to/exec
áá¯á¶ááŸáẠsyntax á á¡ááá¯ááá¯ááááá¯ááºáá±á¬ á¡ááŒá¬ážááœá±ážáá»ááºááŸá¯áá»á¬ážááᯠáá¶á·ááá¯ážáá±ážááẠ(ááŒááºáááºá áááºááŒááºážá ááŸá áºá ááºá ááŸá áºá ááºá áá ááºá á¡áááºá ááºá áá±á·á ááºá áááºážáá±á«ááºáá¶á áá¬áá®ááá¯ááºáž)
# ÐапÑÑкаеÑÑÑ Ð¿ÐŸÑле пеÑезагÑÑзкО ÑОÑÑеЌÑ
@reboot /exec/on/reboot
# ÐапÑÑкаеÑÑÑ Ñаз в ЎеМÑ
@daily /exec/daily
# ÐапÑÑкаеÑÑÑ Ñаз в ÑаÑ
@hourly /exec/daily
Task execution áááºáááºážáá»ááº
Vixie cron ááẠááá·áºá¡á¬áž áá¯ááºáá±á¬ááºáá±ááá·áº á¡ááºááºáá®áá±ážááŸááºážáá»á¬ážá áááºáááºážáá»ááºááᯠááŒá±á¬ááºážáá²ááá¯ááºá á±áá«áááºá
Environment variable áá»á¬ážááᯠUSERá LOGNAME ááŸáá·áº HOME ááẠdaemon ááŸáá±ážáá±á¬ááºáááºááá¯ááºáá² ááá¯ááºáá
áºáá¯á០áá°áá±á¬ááºááœá¬ážááŒááºážááŒá
áºáááºá
á¡áá»áá¯á·áá±á¬ Environment variables (á¡áá°ážáááŒáá·áº SHELL ááŸáá·áº HOME) ááᯠáá¯ááºáá±á¬ááºáááºá¡ááœáẠcron ááá¯ááºááá¯ááºá á¡áá¯á¶ážááŒá¯áá«áááºá á€áááºááŸá¬ á áááºááŒáá¯ááºáá¯ááºáá±á¬ááºá áá¬áá»á¬ážááᯠáá¯ááºáá±á¬ááºááẠstandard sh á¡á á¬áž bash ááᯠá¡áá¯á¶ážááŒá¯ááŒááºážááŸá¬ á¡á±á¬ááºáá«á¡ááá¯ááºáž ááŒá áºááá¯ááºáá«áááºá
SHELL=/bin/bash
HOME=/tmp/
# exec бÑÐŽÐµÑ Ð·Ð°Ð¿ÑÑеМ bash-еЌ в /tmp/
* * * * * /path/to/exec
á¡áá¯á¶ážá áœááºá¡á¬ážááŒáá·áºá ááá¬ážááœááºáááºááŸááºáá¬ážáá±á¬áááºáááºážáá»áẠvariable á¡á¬ážáá¯á¶ážááᯠ(cron ááŒáá·áºá¡áá¯á¶ážááŒá¯ááẠááá¯á·ááá¯áẠáá¯ááºáááºážá ááºááŸááá¯á¡ááºáá±á¬) ááẠáá¯ááºáá±á¬ááºáá±ááá·áºá¡áá¯ááºááá¯á· áá±ážááá¯á·áááºááŒá áºáááºá
ááá¯ááºáá»á¬ážááᯠáááºážááŒááºáááºá crontab ááẠVISUAL ááá¯á·ááá¯áẠEDITOR áááºáááºážáá»áẠááŒá±á¬ááºážáá²ááá¯ááºáá±á¬ ááŒá±á¬ááºážáá²ááŸá¯ááœáẠáááºááŸááºáá¬ážááá·áº áááºážááŒááºáá°ááᯠá¡áá¯á¶ážááŒá¯áááºá crontab ááá¯áááºáááºááá·áºáááºáááºážáá»ááºááœáẠá€ááááºážááŸááºáá»á¬ážááá¯áááºááŸááºááá¬ážáá«á "/usr/ucb/vi" ááá¯á¡áá¯á¶ážááŒá¯ááẠ(ucb ááẠUniversity of Californiaá Berkeley ááŒá áºááá¯ááºáááº)á
Debian ááŸáá·áº Ubuntu ááœáẠcron
Debian á developer áá»á¬ážááŸáá·áº derivative distributions áá»á¬áž ááœááºááŸááá¬áá«ááŒá®á
áááá¬áááºááŸá¬ážááŸá¯áááºážáá±á¬áºáááºáž ááŒááºáá¬áááºáá¬áá±á¬ááŒá±á¬ááºážáá²ááŸá¯áá»á¬ážááœáẠááœá²á·á ááºážááŸá¯ááá¯ááºáá»á¬ážááŸáá·áº áá¯ááºáá±á¬ááºá áá¬ááá¬ážáá»á¬ážááááºáá±áá¬áá«áááºáááºá
Debian ááŸá á¡áá¯á¶ážááŒá¯áá°ááá¬ážáá»á¬ážááẠ/var/spool/cron/crontabs áááºážááœáŸááºááœáẠáááºááŸáááŒá®áž á áá áºááá¬ážááẠ/etc/crontab ááœááºááŸááá±áá²ááŒá áºáááºá Debian package-specific task tables áá»á¬ážááᯠcron daemon á¡ááá¯á¡áá»á±á¬ááºáááºááá·áºáá±áá¬á០/etc/cron.d ááœáẠáá¬ážááŸááá¬ážáá«áááºá á¡áá¯á¶ážááŒá¯áá°áááºáá±á¬ááºááœáá·áºááááºážáá»á¯ááºááŸá¯ááᯠ/etc/cron.allow ááŸáá·áº /etc/cron.deny ááá¯ááºáá»á¬ážá០ááááºážáá»á¯ááºáá¬ážáááºá
áá°áááºáž shell ááẠ/bin/sh ááŒá
áºáá±áá²ááŒá
áºááŒá®ážá Debian ááœáẠPOSIX-ááá¯ááºáá»á±á¬áá®ááœá±ááŸááá±á¬ shell áá±ážáá
áºáá¯ááŒá
áºáááº
Debian ááá±á¬ááºáá¯á¶ážááœááºáá¬ážááŸááºážáá»á¬ážááœáẠCron ááá¯ááºááá¯ááºá systemd ááŸáá áºááá·áº á áááºáá²á·ááŒá®ážá launch configuration ááᯠ/lib/systemd/system/cron.service ááœáẠááŒáá·áºááŸá¯ááá¯ááºáá«áááºá áááºáá±á¬ááºááŸá¯ááœá²á·á ááºážáá¯á¶ááœáẠá¡áá°ážá¡ááœá±áááŸááá«á áá¯á¶ážá áœá²áá°áá áºáŠážá á®á crontab ááœáẠááá¯ááºááá¯ááºááŒá±ááŒá¬áá¬ážáá±á¬ áááºáááºážáá»áẠvariable áá»á¬ážááŸáá áºááá·áº ááá¯ááá¯ááááºááœá±á·áá±á¬ áá¯ááºáá±á¬ááºá áá¬á á®áá¶ááá·áºááœá²ááŸá¯ááᯠáá¯ááºáá±á¬ááºááá¯ááºáá«áááºá
RedHatá Fedora ááŸáá·áº CentOS ááœáẠáááá¯áá®
áá¯á¶áá±ááœá²á·á ááºážáá¯á¶ááẠáá¯á¶ááŸááºáá±áá¬áá»á¬ážááœááºááŒá áºáááº- á áá áºááá¬ážááẠ/etc/crontab ááœááºááŸáááŒá®ážá á¡áá¯ááºáá»á¬ážááẠáááºážááá¯á·áááá¬ážáá»á¬ážááᯠ/etc/cron.d ááœááºááá·áºáááºá á¡áá¯á¶ážááŒá¯áá°ááá¬ážáá»á¬ážááẠ/var/spool/cron/crontabs ááá¯á·ááœá¬ážáá«áááºá
daemon ááẠsystemd ááááºážáá»á¯ááºááŸá¯á¡á±á¬ááºááœááºá¡áá¯ááºáá¯ááºáááºá áááºáá±á¬ááºááŸá¯ááœá²á·á ááºážáá¯á¶ááẠ/lib/systemd/system/crond.service ááŒá áºáááºá
Red Hat áá²á·ááá¯á· ááŒáá·áºáá±ááŸá¯áá»á¬ážááœááºá /bin/sh ááᯠá ᶠbash ááŒá áºááá·áº startup ááœáẠáá¯á¶áá±ááŒáá·áº á¡áá¯á¶ážááŒá¯áá«áááºá /bin/sh ááŸáááá·áº cron á¡áá¯ááºáá»á¬ážááᯠáá¯ááºáá±á¬ááºáá±á¬á¡áá«á bash shell ááẠPOSIX-ááá¯ááºáá»á±á¬áá®ááœá±ááŒá áºáá±á¬áá¯ááºááœááºá áááºááŒá®áž á¡ááŒááºá¡ááŸááºá¡áá»áá¯ážáááºáá±á¬ááºááŸá¯áááŸááá±á¬áá¯ááºááœááºáá¯ááºáá±á¬ááºáá±ááá·áºáá±á¬ááºáááºááœá²á·á ááºážáá¯á¶ááá¯áááºáááºááá¯ááºááŒá±á¬ááºážáááááŒá¯ááá·áºáááºá
SLES ááŸáá·áº openSUSE ááŸá áááá¯áá®
áá»á¬áááºááŒáá·áºáá»á®áá±áž SLES ááŸáá·áº áááºážá áááºážáááºáá¬áá±á¬ openSUSE ááá¯á·ááẠáá°áá®áá±á¬áááá¯áá®áá»á¬ážááᯠá¡áá¯á¶ážááŒá¯áááºá á€áá±áá¬ááœáẠdaemon ááá¯áááºáž systemd á¡á±á¬ááºááœááºááœáá·áºáá¬ážáááºá áááºáá±á¬ááºááŸá¯ááœá²á·á ááºážáá¯á¶ááẠ/usr/lib/systemd/system/cron.service ááœááºáááºááŸááááºá ááœá²á·á ááºážááŸá¯- /etc/crontabá /etc/cron.dá /var/spool/cron/tabsá /bin/sh ááẠPOSIX-ááá¯ááºáá»á±á¬áá®ááœá±ááŒá áºáá±á¬ á¡ááŒááºá¡ááŸááºáá¯á¶á·ááŒááºááŸá¯áááŸááá±á¬áá¯ááºááœáẠáá¯ááºáá±á¬ááºáá±ááá·áº áá°áá®áá±á¬ bash ááŒá áºáááºá
Vixie cron áááááá¬
áá±ááºáá Ạcron ááá¬ážááŒá±ážáá»á¬ážááẠVixie cron ááŸáá·áº ááŸáá¯ááºážááŸááºáá»áŸáẠáááááá¬áᬠááŒá±á¬ááºážáá²ááŒááºážáááŸááá±á¬áºáááºáž áááá¯ááááºáá¡ááŒá±áá¶ááá±á¬ááá¬ážáá»á¬ážááᯠáá¬ážáááºáááºáááá¯á¡ááºáá±á¬ á¡ááºá¹áá«áááºá¡áá áºáá»á¬ážááᯠáááŸááá±áá²ááŒá áºáááºá ဠextension á¡áá»á¬ážá á¯ááẠáá®ááá¯ááºážááá¯ááºáž áá¶á·áá»ááºážááŒá®áž áá¯ááºááᯠááŸá¯ááºááœá±ážá á±áááºá Paul Vixey á áá°áááºáž cron á¡áááºážá¡ááŒá áºáá¯ááºááᯠáááºááᬠááŒááºáá°ážá áá¬áá«áá²á
ááá¯á·ááŒá±á¬áá·áºá Vixie cron 3.0pl1 ááŸá áºáá¯á áá¯á¶ážá¡ááœáẠá¡áá¯á¶ážáá»á¬ážáá±á¬ cron áááá¯ááááºááᯠá¡áá¯á¶ážááŒá¯á cron á ááºáá á¹á ááºážááᯠááá¯ááºážááŒá¬ážá áááºááŒá¬ááẠáá¯á¶ážááŒááºáá²á·áááºá á á¬áááºááŒááºážááᯠááŸá¯ááºááœá±ážá á±áá±á¬ ifdefs áá»á¬ážááᯠáááºááŸá¬ážááŒá®ážá¡áá±ážá áááºá¡áá±ážá áááºá¡áá»ááºá¡áááºáá»á¬ážááᯠáá»ááºááŸááºááŒááºážááŒáá·áº ááá°áá¬áá»á¬ážááᯠááá¯ážááŸááºážá á±áá«áááºá
áááºááá¯ážááá¯ááºáá±á¬ááºááŸá¯ááᯠá¡ááá·áºáá»á¬ážá áœá¬ ááœá²ááŒá¬ážááá¯ááºáááºá
- á¡á á®á¡á ááºá áááºááŒááºážá
- áá¯ááºáá±á¬ááºáááá·áº á¡áá¯ááºáá»á¬ážá á¬áááºážááᯠá á¯áá±á¬ááºážááŒááºážááŸáá·áº á¡ááºááááºáá¯ááºááŒááºážá
- á¡ááá cron loop áááºáááºáá±áááºá
- á¡áá¯ááºáá áºáᯠá áááºáá«á
áá°ááá¯á·ááᯠá¡á ááºááá¯ááºááŒáá·áºáá¡á±á¬ááºá
á áááºááŒááºáž
á áááºáá±á¬á¡áá«á áá¯ááºáááºážá ááºááá¯ááºáᬠá¡ááŒá±á¬ááºážááŒáá»ááºáá»á¬ážááᯠá á áºáá±ážááŒá®ážáá±á¬ááºá cron ááẠSIGCHLD ááŸáá·áº SIGHUP á¡áá»ááºááŒáááºááá¯ááºáá»á¬ážááᯠááá·áºááœááºážáááºá ááááá áºáá¯ááẠááá±ážáá¯ááºáááºážá ááºááá¯áááºá á²ááŒááºážááŸáá·áºáááºáááºá ááŸááºáááºážáá áºáá¯ááŒá¯áá¯ááºáááºá áá¯ááááá áºáá¯ááẠááŸááºáááºážááá¯ááºáááá¯ááºáá±á¬áºááŒáá»ááºá¡á¬áž ááááºáááº-
signal(SIGCHLD, sigchld_handler);
signal(SIGHUP, sighup_handler);
cron daemon ááẠsuperuser á¡ááŒá áºááŸáá·áº main cron directory ááŸáá¬áá»áŸáẠsystem áá±á«áºááœáẠáá áºáá±á¬ááºáááºáž á¡ááŒá²áááºáááºáá«áááºá á¡á±á¬ááºáá«áá±á«áºááá¯ááŸá¯áá»á¬ážááẠdaemon áá¯ááºáááºážá ááºá PID ááŒáá·áº áá±á¬á·ááºááá¯ááºáá áºáá¯áááºáá®ážááŒá®ážá á¡áá¯á¶ážááŒá¯áá°ááŸááºáááºááŒá±á¬ááºáž áá±áá»á¬á á±áᬠáááºááŸááááºážááœáŸááºááᯠáááºáááá¯ááºá¡ááŒá ẠááŒá±á¬ááºážáá²áá«á
acquire_daemonlock(0);
set_cron_uid();
set_cron_cwd();
áá¯ááºáááºážá ááºáá»á¬ážá áááºáá±á¬á¡áá«ááœáẠá¡áá¯á¶ážááŒá¯ááá·áº áá¯á¶áá±áááºážááŒá±á¬ááºážááᯠáááºááŸááºáá¬ážáááº-
setenv("PATH", _PATH_DEFPATH, 1);
ááá¯á·áá±á¬áẠáá¯ááºáááºážá ááºááẠ"daemonized" ááŒá áºáááº- áááºážááẠfork ááá¯áá±á«áºááá¯ááŒá®áž ááá±ážáá¯ááºáááºážá áẠ(calling setsid) ááœáẠá¡ááá¯ááºážá¡áá áºáá áºáá¯ááᯠáá±á«áºááá¯ááŒááºážááŒáá·áº áá¯ááºáááºážá ááºá ááá±ážáá±á¬áºáá®ááᯠáááºáá®ážáá±ážáááºá ááááá¯ááºáááºážá ááºááᯠáááá¯á¡ááºáá±á¬á·áá²á áááºážá០ááœááºáááº-
switch (fork()) {
case -1:
/* кÑОÑОÑеÑÐºÐ°Ñ ÐŸÑОбка О завеÑÑеМОе ÑабПÑÑ */
exit(0);
break;
case 0:
/* ЎПÑеÑМОй пÑПÑеÑÑ */
(void) setsid();
break;
default:
/* ÑПЎОÑелÑÑкОй пÑПÑеÑÑ Ð·Ð°Ð²ÐµÑÑÐ°ÐµÑ ÑабПÑÑ */
_exit(0);
}
áááºááá¯ááºáááºážá ááºááᯠáááºá á²ááŒááºážááẠáá±á¬á·ááºááá¯ááºáá±á«áºááŸá áá±á¬á·ááºááᯠáá¯ááºáá±ážáááºá ááá¯á·á¡ááŒááºá ááá¯ááºááŸá PID ááᯠááá±ážááá¯á· á¡ááºááááºáá¯ááºááẠááá¯á¡ááºáááºá áááºážáá±á¬ááºá á¡áá¯ááºáá±áá¬áá±á·á áºááá¯ááŒáá·áºááœááºážáááº-
/* пПвÑПÑÐœÑй заÑ
Ð²Ð°Ñ Ð»ÐŸÐºÐ° */
acquire_daemonlock(0);
/* ÐапПлМеМОе ÐÐ */
database.head = NULL;
database.tail = NULL;
database.mtime = (time_t) 0;
load_database(&database);
ááá¯á·áá±á¬áẠcron ááẠáááºáá¡áá¯ááºá ááºáááºážááá¯á· áááºáááºááœá±á·áá»á¬ážáááºá áá«áá±ááá·áº á¡áááºááá±á¬á· task list ááᯠloading áá¯ááºááŒáá·áºááá¯á· ááá¯ááºáááºáá«áááºá
á¡áá¯ááºá á¬áááºážááᯠá á¯áá±á¬ááºážááŒááºážááŸáá·áº á¡ááºááááºáá¯ááºááŒááºážá
load_database áá¯ááºáá±á¬ááºáá»ááºááẠáá¯ááºáá±á¬ááºá áá¬áá»á¬ážá á¬áááºážááᯠáááºááẠáá¬áááºááŸááááºá áááºážááẠáááºáá áá Ạcrontab ááŸáá·áº áá¯á¶ážá áœá²áá°ááá¯ááºáá»á¬ážááŒáá·áº áááºážááœáŸááºááᯠá á áºáá±ážáááºá ááá¯ááºáá»á¬ážááŸáá·áº áááºážááœáŸááºáá»á¬áž áááŒá±á¬ááºážáá²áá«áá áá¯ááºáá±á¬ááºá áá¬á á¬áááºážááᯠááŒááºáááºáááºááŸá¯áááºááá¯ááºáá«á ááá¯ááºáá«áá á¡áá¯ááºá á¬áááºážá¡áá áºáá áºáᯠá áááºááœá²á·á ááºážáá«áááºá
á¡áá°ážááá¯ááºááŸáá·áº ááá¬ážá¡áááºáá»á¬ážááŒáá·áº á áá áºááá¯ááºááᯠáááºáá±áááº-
/* еÑлО Ñайл ÑОÑÑеЌМПй ÑаблОÑÑ ÐžÐ·ÐŒÐµÐœÐžÐ»ÑÑ, пеÑеÑОÑÑваеЌ */
if (syscron_stat.st_mtime) {
process_crontab("root", "*system*",
SYSCRONTAB, &syscron_stat,
&new_db, old_db);
}
á ááºááá¯ááºážáá áºáá¯ááœáẠá¡áá¯á¶ážááŒá¯áá°ááá¬ážáá»á¬ážááᯠáááºáá±áááº-
while (NULL != (dp = readdir(dir))) {
char fname[MAXNAMLEN+1],
tabname[MAXNAMLEN+1];
/* ÑОÑаÑÑ ÑÐ°Ð¹Ð»Ñ Ñ ÑПÑкПй Ме МаЎП*/
if (dp->d_name[0] == '.')
continue;
(void) strcpy(fname, dp->d_name);
sprintf(tabname, CRON_TAB(fname));
process_crontab(fname, fname, tabname,
&statbuf, &new_db, old_db);
}
ááá¯á·áá±á¬áẠáá±áá¬áá±á·á áºá¡áá±á¬ááºážááᯠá¡áá áºáá áºáá¯ááŒáá·áº á¡á á¬ážááá¯ážáááºá
á¡áááºáá±á¬áºááŒáá«ááá°áá¬áá»á¬ážááœááºá process_crontab áá¯ááºáá±á¬ááºáá»ááºááẠááá¬ážááá¯ááºá¡áááºááŸáá·áº ááá¯ááºáá®áá±á¬ á¡áá¯á¶ážááŒá¯áá°ááŸááá±ááŒá±á¬ááºáž (superuser ááá¯ááºáá»áŸááº) áá±á«áºááá¯ááŒá®áž load_user áá¯áá±á«áºáá«áááºá áá±á¬ááºáá áºáá¯á ááá¯ááºááᯠá á¬ááŒá±á¬ááºážáá áºááŒá±á¬ááºážááŒá®ážáá áºááŒá±á¬ááºáž áááºááŒá®ážááŒá®-
while ((status = load_env(envstr, file)) >= OK) {
switch (status) {
case ERR:
free_user(u);
u = NULL;
goto done;
case FALSE:
e = load_entry(file, NULL, pw, envp);
if (e) {
e->next = u->crontab;
u->crontab = e;
}
break;
case TRUE:
envp = env_set(envp, envstr);
break;
}
}
á€ááœááºá load_env/env_set áá¯ááºáá±á¬ááºáá»ááºáá»á¬ážááᯠá¡áá¯á¶ážááŒá¯á áááºáááºážáá»áẠvariable ááᯠ(VAR=value áá±á¬ááºááá¯ááºážáá»á¬áž) áááºááŸááºáá¬ážáááºááŒá áºá á± ááá¯á·ááá¯áẠáá¯ááºáá±á¬ááºá áá¬áá±á¬áºááŒáá»ááºááẠload_entry áá¯ááºáá±á¬ááºáá»ááºááᯠá¡áá¯á¶ážááŒá¯á (* * * * * /path/to/exec) ááá¯áááºáááºá
load_entry ááŒááºáá¬ááá·áº entry entity ááẠáá±áá°áá»áá¯ááºáá±á¬ááºá áá¬áá»á¬ážá á¬áááºážááœáẠááá·áºááœááºážáá¬ážáá±á¬ áá»áœááºá¯ááºááá¯á·ááá¯ááºáááºážááŒá áºáááºá áá¯ááºáá±á¬ááºáá»ááºááẠá¡áá»áááºáá±á¬áºáááºá á áá¬ážááŒáá·áº ááœá²ááŒááºážá áááºááŒá¬ááŸá¯ááᯠáá¯ááºáá±á¬ááºáááºá ááá¯á·áá±á¬áº áá»áœááºá¯ááºááá¯á·ááẠáááºáááºážáá»áẠááááºážááŸááºáá»á¬ážááŸáá·áº á¡áá¯ááºá áááºááŒááºážááá¯ááºáᬠááá·áºáááºáá±á¬ááºáá»á¬áž ááœá²á·á ááºážááŒááºážááᯠááá¯ááá¯á áááºáááºá á¬ážáá«áááºá
/* пПлÑзПваÑÐµÐ»Ñ Ðž гÑÑппа ÐŽÐ»Ñ Ð·Ð°Ð¿ÑÑка заЎаÑО беÑÑÑÑÑ ÐžÐ· passwd*/
e->uid = pw->pw_uid;
e->gid = pw->pw_gid;
/* Ñелл пП ÑЌПлÑÐ°ÐœÐžÑ (/bin/sh), еÑлО пПлÑзПваÑÐµÐ»Ñ ÐœÐµ Ñказал ÐŽÑÑгПе */
e->envp = env_copy(envp);
if (!env_get("SHELL", e->envp)) {
sprintf(envstr, "SHELL=%s", _PATH_BSHELL);
e->envp = env_set(e->envp, envstr);
}
/* ЎПЌаÑÐœÑÑ ÐŽÐžÑекÑПÑÐžÑ */
if (!env_get("HOME", e->envp)) {
sprintf(envstr, "HOME=%s", pw->pw_dir);
e->envp = env_set(e->envp, envstr);
}
/* пÑÑÑ ÐŽÐ»Ñ Ð¿ÐŸÐžÑка пÑПгÑаЌЌ */
if (!env_get("PATH", e->envp)) {
sprintf(envstr, "PATH=%s", _PATH_DEFPATH);
e->envp = env_set(e->envp, envstr);
}
/* ÐžÐŒÑ Ð¿ÐŸÐ»ÑзПвÑÐµÐ»Ñ Ð²ÑегЎа Оз passwd */
sprintf(envstr, "%s=%s", "LOGNAME", pw->pw_name);
e->envp = env_set(e->envp, envstr);
áááºáááœááºážáááºááẠáááºááŸááá¯ááºáá±á¬ááºá áá¬áá»á¬ážá á¬áááºážááŸáá·áº á¡áá¯ááºáá¯ááºáááºá
Main Loop
Version 7 Unix á០áá°áááºáž cron ááẠááá¯ážááá¯ážááŸááºážááŸááºáž á¡áá¯ááºáá¯ááºáááº- áááºážááẠconfiguration ááᯠá¡ááœááºáá áºááœááºážááœáẠááŒááºáááºááŒá®áž superuser á¡ááŒá ẠáááºááŸá áááá áºá áá¯ááºáááºážáá±á¬ááºáá¬áá»á¬ážááᯠá áááºáᬠáá±á¬ááºáááá áºá¡á ááá¯ááºážá¡áá á¡áááºáá²á·áá«áááºá á ááºá¡áá±á¬ááºážáá»á¬ážááœáẠá€ááá¯ážááŸááºážáá±á¬áááºážáááºážááẠá¡áááºážá¡ááŒá áºáá»á¬ážá áœá¬ááá¯á¡ááºáááºá
SysV ááœáẠá¡ááŒá¬ážáá¬ážááŸááºážáá áºáá¯á¡á¬áž á¡ááá¯ááŒá¯áá²á·ááŒá®áž áááºážááœáẠdaemon ááẠá¡áá¯ááºáááºááŸááºáá¬ážááá·áº á¡áá®ážáá¯á¶ážáááá áºá¡áá ááá¯á·ááá¯áẠáááá Ạ30 ááŒá¬áááºá¡áá á¡áááºáá»á±á¬áºááœá¬ážáá²á·áááºá á€áá¯ááºááœáẠááœá²á·á ááºážááŸá¯áá¯á¶á á¶ááᯠááŒááºáááºáááºááŸá¯ááŒááºážááŸáá·áº á á áºáá±ážááŒááºážá¡ááœáẠáááºážááŒá áºá¡áááºážáááºááᯠáá¯á¶ážá áœá²áá²á·áá±á¬áºáááºáž á¡áá¯ááºáá»á¬ážá á¬áááºážááᯠá¡ááŒááºá¡ááºááááºáá¯ááºáá¬ááœáẠá¡áááºáááŒá±ááŒá áºáá¬áá²á·áááºá
Vixie cron ááẠáá áºáááá áºáá»áŸáẠáá áºááŒááẠá¡áá¯ááºá á¬áááºážáá»á¬ážááᯠá á áºáá±ážááŒááºážááá¯á· ááŒááºááœá¬ážáááºá áá¶áá±á¬ááºážá áœá¬ááẠ80s ááŸá±á¬ááºážááá¯ááºážááœáẠáá¯á¶ááŸáẠUnix á ááºáá»á¬ážááœáẠá¡áááºážá¡ááŒá áºáá»á¬áž áááááá¬áᬠááá¯ááá¯áá»á¬ážááŒá¬ážáá¬áááº-
/* пеÑвОÑÐœÐ°Ñ Ð·Ð°Ð³ÑÑзка Ð·Ð°ÐŽÐ°Ñ */
load_database(&database);
/* запÑÑÑОÑÑ Ð·Ð°ÐŽÐ°ÑО, пПÑÑавлеММÑе к вÑÐ¿ÐŸÐ»ÐœÐµÐœÐžÑ Ð¿ÐŸÑле пеÑезагÑÑзкО ÑОÑÑÐµÐŒÑ */
run_reboot_jobs(&database);
/* ÑЎелаÑÑ TargetTime МаÑалПЌ блОжайÑей ЌОМÑÑÑ */
cron_sync();
while (TRUE) {
/* вÑпПлМОÑÑ Ð·Ð°ÐŽÐ°ÑО, пПÑле ÑегП ÑпаÑÑ ÐŽÐŸ TargetTime Ñ Ð¿ÐŸÐ¿ÑавкПй Ма вÑеЌÑ, пПÑÑаÑеММПе Ма заЎаÑО */
cron_sleep();
/* пеÑеÑОÑаÑÑ ÐºÐŸÐœÑОгÑÑаÑÐžÑ */
load_database(&database);
/* ÑПбÑаÑÑ Ð·Ð°ÐŽÐ°ÑО ÐŽÐ»Ñ ÐŽÐ°ÐœÐœÐŸÐ¹ ЌОМÑÑÑ */
cron_tick(&database);
/* пеÑевеÑÑО TargetTime Ма МаÑалП ÑлеЎÑÑÑей ЌОМÑÑÑ */
TargetTime += 60;
}
cron_sleep áá¯ááºáá±á¬ááºáá»ááºááẠjob_runqueue (á á¬áááºážááœááºážááŒá®áž áá¯ááºáá±á¬ááºá áá¬áá»á¬áž) ááŸáá·áº do_command (á¡áá¯ááºáá áºáá¯á á®ááá¯ááºážááᯠáá¯ááºáá±á¬ááºáááº) áá¯ááºáá±á¬ááºáá»ááºáá»á¬ážááᯠáá±á«áºááá¯ááŒááºážááœáẠá¡áá¯ááºáá»á¬ážááᯠáá¯ááºáá±á¬ááºáá¬ááœáẠááá¯ááºááá¯ááºáá«áááºáá«áááºá áá±á¬ááºáá¯á¶ážáá¯ááºáá±á¬ááºáá»ááºááẠááá¯ááá¯á¡áá±ážá áááºá á áºáá±ážááá»áá¯ážáááºáááºá
á¡áá¯ááºáá áºáá¯ááᯠáá¯ááºáá±á¬ááºááŒááºážá
do_command áá¯ááºáá±á¬ááºáá»ááºááᯠáá±á¬ááºážááœááºáá±á¬ Unix á ááá¯ááºááŒáá·áº áá¯ááºáá±á¬ááºááẠá ááá¯ááá¯áááºááŸá¬ áááºážááẠá¡áá¯ááºáá áºáá¯ááᯠáááŒáá¯ááºáááºážáá¯ááºáá±á¬ááºááẠáááºážááœá²áá áºáᯠááŒá¯áá¯ááºáááºá ááááá¯ááºáááºážá á¥áºááẠáá¯ááºáá±á¬ááºá áá¬áá»á¬ážááᯠáááºáááºáá¯ááºáá±á¬ááºáá±ááŒá®ážá ááá±ážáá¯ááºáááºážá ááºááẠáá¯ááºáá±á¬ááºá áá¬áá¯ááºáááºážá ááºááᯠááŒááºáááºáááº-
switch (fork()) {
case -1:
/*Ме ÑЌПглО вÑпПлМОÑÑ fork */
break;
case 0:
/* ЎПÑеÑМОй пÑПÑеÑÑ: Ма вÑÑкОй ÑлÑÑай еÑе Ñаз пÑПбÑеЌ заÑ
ваÑОÑÑ Ð³Ð»Ð°Ð²ÐœÑй лПк */
acquire_daemonlock(1);
/* пеÑеÑ
ПЎОЌ к ÑПÑЌОÑÐŸÐ²Ð°ÐœÐžÑ Ð¿ÑПÑеÑÑа заЎаÑО */
child_process(e, u);
/* пП завеÑÑÐµÐœÐžÑ ÐŽÐŸÑеÑМОй пÑПÑеÑÑ Ð·Ð°ÐºÐ°ÐœÑÐžÐ²Ð°ÐµÑ ÑабПÑÑ */
_exit(OK_EXIT);
break;
default:
/* ÑПЎОÑелÑÑкОй пÑПÑеÑÑ Ð¿ÑÐŸÐŽÐŸÐ»Ð¶Ð°ÐµÑ ÑабПÑÑ */
break;
}
child_process ááœáẠáá¯áá¹áááá»á¬ážá áœá¬ ááŸááááº- áááºážááẠá á¶ááœááºááŸáááŸá¯ááŸáá·áº á¡ááŸá¬ážá¡ááœááºážá á®ážááŒá±á¬ááºážáá»á¬ážááᯠáááºáá¶áááºá ááá¯á·áá±á¬áẠáááºážááá¯á·ááᯠáá±ážááºááá¯á· áá±ážááá¯á·ááẠ(MAILTO áááºáááºážáá»áẠvariable ááᯠá¡áá¯ááºááá¬ážááœáẠáááºááŸááºáá¬ážáá«á)á áá±á¬ááºáá¯á¶ážááœááºá á¡áá¯ááºá á¡ááá áá¯ááºáááºážá ááºááᯠá á±á¬áá·áºáá»áŸá±á¬áºáá±áá«áááºá ááŒá®ážáá«ááŒá®á
áá¯ááºáááºážá á¥áºááᯠá¡ááŒá¬ážáááºážáá¯á¶áááºážááœááŒáá·áº ááœá²á·á ááºážáá¬ážáááº-
switch (vfork()) {
case -1:
/* пÑО ПÑОбкО ÑÑÐ°Ð·Ñ Ð·Ð°Ð²ÐµÑÑаеÑÑÑ ÑабПÑа */
exit(ERROR_EXIT);
case 0:
/* пÑПÑеÑÑ-вМÑк ÑПÑЌОÑÑÐµÑ ÐœÐŸÐ²ÑÑ ÑеÑÑОÑ, ÑеÑЌОМал О Ñ.ÐŽ.
*/
(void) setsid();
/*
* ЎалÑÑе ЌМПгПÑÐ»ÐŸÐ²ÐœÐ°Ñ ÐœÐ°ÑÑÑПйка вÑвПЎа пÑПÑеÑÑа, ПпÑÑÑОЌ ÐŽÐ»Ñ ÐºÑаÑкПÑÑО
*/
/* ÑЌеМа ЎОÑекÑПÑОО, пПлÑзПваÑÐµÐ»Ñ Ðž гÑÑÐ¿Ð¿Ñ Ð¿ÐŸÐ»ÑзПваÑелÑ,
* ÑП еÑÑÑ Ð¿ÑПÑеÑÑ Ð±ÐŸÐ»ÑÑе Ме ÑÑпеÑпПлÑзПваÑелÑÑкОй
*/
setgid(e->gid);
setuid(e->uid);
chdir(env_get("HOME", e->envp));
/* запÑÑк ÑаЌПй кПЌаМЎÑ
*/
{
/* пеÑÐµÐŒÐµÐœÐœÐ°Ñ ÐŸÐºÑÑÐ¶ÐµÐœÐžÑ SHELL ÑказÑÐ²Ð°ÐµÑ ÐœÐ° ОМÑеÑпÑеÑаÑÐŸÑ ÐŽÐ»Ñ Ð·Ð°Ð¿ÑÑка */
char *shell = env_get("SHELL", e->envp);
/* пÑПÑеÑÑ Ð·Ð°Ð¿ÑÑкаеÑÑÑ Ð±ÐµÐ· пеÑеЎаÑО ПкÑÑÐ¶ÐµÐœÐžÑ ÑПЎОÑелÑÑкПгП пÑПÑеÑÑа,
* ÑП еÑÑÑ ÐžÐŒÐµÐœÐœÐŸ Ñак, как ПпОÑаМП в ÑаблОÑе Ð·Ð°ÐŽÐ°Ñ Ð¿ÐŸÐ»ÑзПваÑÐµÐ»Ñ */
execle(shell, shell, "-c", e->cmd, (char *)0, e->envp);
/* ПÑОбка â О пÑПÑеÑÑ ÐœÐ° запÑÑÑОлÑÑ? завеÑÑеМОе ÑабПÑÑ */
perror("execl");
_exit(ERROR_EXIT);
}
break;
default:
/* ÑаЌ пÑПÑеÑÑ Ð¿ÑÐŸÐŽÐŸÐ»Ð¶Ð°ÐµÑ ÑабПÑÑ: Ð¶ÐŽÐµÑ Ð·Ð°Ð²ÐµÑÑÐµÐœÐžÑ ÑабПÑÑ Ðž вÑвПЎа */
break;
}
á¡á²áá«á á¡ááŒá±áá¶á¡á¬ážááŒáá·áº cron áá«á áá±ážáá¶áá±á«ááºáá®áá±á¬ áá¯á¶ážá áœá²áá°áá»á¬ážá¡ááœáẠá á¬áááºážááá¯ááºáá¬ážáá±á¬ á áááºáááºá á¬ážááœááºá¡áá±ážá áááºá¡áá»ááºá¡áá»áá¯á·ááᯠáá»áœááºá¯ááºáá»ááºááŸááºáá¬ážáá±á¬áºáááºáž á¡áááá¡áá»ááºááᯠáá±á¬áºááŒáá¬ážáá«áááºá
afterword
Cron ááẠUnix áá±á¬áá á¡áá±á¬ááºážáá¯á¶áž ááá±á·áá¯á¶ážáááºážáá»á¬ážááŒáá·áº ááŒá¯áá¯ááºáá¬ážááá·áº á¡á¶á·ááŒá áá¬áá±á¬ááºážáá±á¬ááºá¡á±á¬áẠááá¯ážááŸááºážááŒá®áž á¡áá¯á¶ážáááºáá±á¬ áááá¯ááááºáá áºáá¯ááŒá áºáááºá áá°áááẠá¡ááá¯áá¬ááŸááá¯ááºáááºáá±á¬áºáááºáž ááá¯áááºá á¯ááŸá áºáá»á¬ážá áœá¬ááŒá¬á¡á±á¬áẠáá°á·á¡áá¯ááºááᯠá¡á¶á·á©á áœá¬áá¯ááºáá±á¬ááºáá±áá²á·áááºá Ubuntu áá²á·áá«áá¬áá²á· áá¬ážááŸááºážá¡ááœáẠáá¯ááºááᯠááŒááºááŒá®áž áá áºáá¬áá®ááẠááá¯áááŒá¬áá² áá»á±á¬áºáá»á±á¬áºááœáŸááºááœáŸáẠáá±áá²á·áááºá áá« áááºážááᯠáá»áŸáá±ááá¯ááºáááºááá¯á· áá»áŸá±á¬áºááá·áºáá«áááºá
áááºážá¡ááŒá±á¬ááºáž áá«ááááá°ážá áá«áá±ááá·áº áá±ááºáá®áá²á· áááá¯ááááºááœá±á ááŸá¯ááºááœá±ážááœááºážááŒá®áž á ááá¹ááááœááºáá²áá²á· ááá±á¬áá¬ážá áá®ááá¯ááá¯ážááŸááºážááŸá¯ááᯠá¡áá»áááºá¡áá±á¬áºááŒá¬á¡á±á¬áẠááá¯ááºáá»á±á¬áá®ááœá±áááŒá áºááá¯ááºáá¬ááᯠááá±á¬áá±á«ááºááá¯ááºááá²á·á¡ááœáẠá¡áááºážáááºáááºážáááºážáááá«áááºá
cron ááœáẠáá±ááºáá®áá±á¬ á¡ááŒá¬ážááœá±ážáá»ááºá áá¬áá»á¬ážá áœá¬ááŸááá«áááº- systemd-timers ááẠááá·áºá¡á¬áž ááŸá®ááá¯ááŸá¯áá»á¬ážááŒáá·áº ááŸá¯ááºááœá±ážáá±á¬á áá áºáá»á¬ážááᯠá á¯á ááºážááá¯ááºá á±áááºá fcron ááẠááá·áºá¡á¬áž áá¯ááºáááºážáá¬áááºáá»á¬ážááŒáá·áº á¡áááºážá¡ááŒá áºáá¯á¶ážá áœá²ááŸá¯ááᯠááá¯ááá¯áá»á±á¬ááœá±á·á áœá¬ ááááºážááŸáááá¯ááºá á±áá«áááºá áá«áá±ááá·áº áá¯áá¹ááá¯ááºáá±ážá¡ááá±á¬á· á¡ááá¯ážááŸááºážáá¯á¶áž crontab á áá»áœááºáá±á¬á·áºá¡ááœáẠá¡ááŒá²áá¯á¶áá±á¬ááºáá«áááºá
á¡ááá¯áá»á¯ááºááŒá±á¬ááá»áŸáẠUnix ááá¯áá»á áºáá«á ááá¯ážááŸááºážáá±á¬áááá¯ááááºáá»á¬ážááá¯áá¯á¶ážáá«á áááºáááááºáá±á¬ááºážá¡ááœáẠmana ááá¯áááºáááºááá±á·áá«ááŸáá·áºá
source: www.habr.com