á áááá ášá°áµá³ á°áá¶áœ á¥áá°ááášá á© áœáá. á á¥ááá« ášá±á ááá«áµ ááá áá®áá«áá®áœ ááá á©áááµ áá á ááá á©á, ááá áá á á¥ááá áááµ, áá®áá«áá®áœ á á¥ááá áááµ á«ááá: á á¥áá± ááá³ áá®á áááá áášá³á°áá.
ášáµá¥áá ááµáá ááááá«áᜠáá ááá±á áµáááµ á¥á áá°á á áážáᢠsed, awk, wc, cut á¥á ááᜠá á®á áá®áá«áᜠá ášáá á á áááá®á»áœá áá á áµááªááµ áá ášáá°á©áµ. á¥ááá¹ ášá°áá°ááµ á¥áá° áá®á, áš 70 áá¹ ášáá ááááá¥á áá.
áááá©á á³áá£á« áá®á áá áá©á á°á ááá©áᣠáá á ááµ ááᣠáµááªáá±á áµá°á« áµá á°áµ áá¥ááᣠá á°áᥠááášáµ áá°áá©á¢ áá áœáá ášáá£á á áá ááááµ áá, á áá áá áš POSIX crontab, á á³ááá ášááááµ áµááá¶áœ ááµá¥ áá áá á áá«á®áœá á¥á ášá áá³áá¶á¹á ááµá á ááá«áá.
ááááµá á¥ášá°á áá á¥á á áá®á ááµá¥ á°áá£á®áœá á¥á«áá± áá? á á©áááµ ááµá¥ ášáµáááµ á ááá¬áœáᜠá áááŽáážá ááááá? ášáá« á áááá³áœá áá áá!
ááá¶áœ
ášááá«áᜠá áá£á¥ POSIX áá®áá³á¥ ááᥠá»á - Vixie áá®á 3.0pl1 áá®á á áŽá¢á«á á¥á á á¡á¡áá± áá®á á áá á®áá«á£ Fedora á¥á CentOS cronie á SLES á¥á openSUSE Vixie cron áá³áªá« ášáá á áá
ášááá«áᜠá áá£á¥
ášá°á áá ááá ášáµáááµ áá®áá«ááœá á ášááá ááážá á ááá áŠáá¬á²áá á²áµá°áᜠááµá¥ ááᜠášáá á áµáááááµ ááᢠáµááá áá®áá«áá®áœ áá¥ášáá á¥á áµ ááá£áµá á¥á á°áá£á«áµá áášá á áá ááážáá ášááá á± á ááááá¶áœá á áµáááááµ á°áááá áá.
á©áááµ áá°á áµááá° ááááᜠáá«ážáá áá° áµáªáµ 7 á©áááµ áááá³áᣠá£ááá ááá ááá á 70áá¹ á á€á áá¥áµá£ á³áááá á¬á á¶ááá°áá ášáá®á¢ á¥áªáµ 7 á©áááµ ášáá®á áá á°áá³áᣠášá áá á°á áá á°áá£á«áµá á áá°á áááµ áááµá¬áµ á áááááµá¢
ášá°ááá°á áááá áá®á ááá áá®áá«á áá, ááá áá ášááá áµáªáµ á áááªáá ášá áá ááá áá á: á ááááá± á á°áá á ááµ áá ášá¥áá áá á²áá, ášá ááµ ááá (/etc/lib/crontab) á°áá£á«áµ áá á°áá ášá¥ á áá¥á¥ á¥á áá°áá£á£áªá á°ášáááá. á áá á£áá á°áá ááµá¥ áá ááá ášáá ášá£ážá á°áá£á«áµ .
á ááá á ááá á¥á á áá á áááááµ ášá°á»á»á áµáªá¶áœ ášááá á©áááµ áá°á áŠáá¬á²áá á²áµá°áᜠáá á°áášááá¢
á 1992 áš crontab á áážáµ á á ááá áááá«áᜠá¥á ášááááá« áá°ášá³á áááᜠá á©áááµ áá°á áŠáá¬á²áá á²áµá°áᜠááµá¥ á ááá áááá ááµá¥ á°á«áµá°áá - POSIX - á¥á áµááá áá®á ášáŽáá³ áµá³áá³ááµ áš de jure á°ášá ááá¢
á¥.á€.á . á 1987 áá áªáá² ášá©áááµ á°á ááááœá áµá áá®á áááµ ášáášááš á áá á áá³ááµ á£á áá áá®á áœáá®áœá ášáá«áµá°á«áá á¥á ášá ášáŽá ááááœá á áá£á¥ ášáá«á«áá áá ášáŽáá á¥áµá á áá£á¢
á áŠáµá°áá ášáªáá² áá®á áµáªáµ áš POSIX ááµááá¶áœá ááááµ ááᚠᣠá á°ášááªá ᣠáá®áá«á ášáá á«á áááµ áá ášá ᣠááá ááááᵠᣠá ââREADME ááµá¥ á«á ááá¶áœ á áµá°áá á áá«áœ ááá áááµ á ááá ášá ᢠá°á«á²á ááµáµá á áá°á¥á ᣠášá°á«á²á áµá áá°ášá á ááœáá, á¥á áá®áá«á áážá¥ ášááœáá ášááá á®áµ áá á¥á» áá. á¥ááá ááµááá¶áœ á á¥ááá« á áá³áµ á°áá³á ááµá á¥á«á°ášá ášáá á©áµ ášáá» á¶ááµáá®áœ ááááᜠáá á°á³áá ááá á°ááᣠáµááá á 90áá¹ ááááªá« áá ášá³á©áµ ááá ášááááµ áµááá¶áœ áá«ášá á áá³áá¶á¹ Vixie croná á¥áá° áµáááµ ááµá°á á ááá á¥á«á°á áážáá¢
á á°ááá á¬áµ á®áá« á¥á SUSE áš Vixie cron - cronie á¹á« á¥á«á³á á© á²áá áŽá¢á«á á¥á á¡á¡áá± á°áá ášááááªá«áá ášáªáá² áá®á á¥áµá ášá¥á ááá¶áœ áá áá áááá¢
á ááááªá« á POSIX á á°á áá ášá°ááážáá áá®áá³á¥ ááááá« á¥ááᣠá¥á á ááá á á Vixie cron ááµá¥ ášáá¡áµá ášá áá£á¥ á á¥á«ááœá á¥á á á³ááá ášááááµ áµááá¶áœ ááµá¥ ášVxie áá®á áá©áá¶áœá á¥ááᢠá¥á á áášášá»á á á¬á áá á«áá á áᥠášáá®á áŽááá áá³áªá« á¥ášáá³ áá.
POSIX áá®áá³á¥
áŠáªá áá áá®á áá áá áá±áá á°á ááá á¥ášá®á á²ááµá£ áááá ááááá¥á á ááªáᜠášáá°á á ášá°á áá á°áá£á«áµ áá ášáááááµ ááµáážá á°á ááᣠáá á áá áᥠá áµá°ááá á¥á áá¹ ááá¢
áá®áᜠášáááµ áá®áá«áᜠáµá¥áµá¥ áá á á¥ášá ááá£áá¡ á«áááášá¥ ášáá«ááµ áá®á áŽáá á¥á áá°á áá á°á°á«áœ ášáá áá®áá³á¥ ááááá«á¢ ášáááá á á²áµá°á ááµá¥ ááá áá¥á«áá³áá± á°á áá ášá°ááš ášá°áá£á á°áá ášáŠáœá á¥áá²á«ááµá ááá áµááá³áᣠáŽáá á°áá ášá°á áá á¥á ášáµáááµ á°áá ášáŠáœ áµá«ááœá áá°á«áá¢
Ð
áá° áá®áá³á¥ ááááá« á áá°áá á á«áµ ááá®áœ á áá¡ ášá°á áááá ášá°áá£á á áá ášá¥ á á áá³áá ááµá¥ áášáᣠá°áá ášá¡á ášááá áá áá«áᣠášá ááá ášá°áá£á á áá ášá¥ á á³á á¥á ášá°áá£á á°áá ášá¡á ááœá³áµá¢ áš crontab ááááá« áá³áááœá¡-
crontab -e # ÑеЎакÑОÑПваÑÑ ÑаблОÑÑ Ð·Ð°ÐŽÐ°Ñ
crontab -l # пПказаÑÑ ÑаблОÑÑ Ð·Ð°ÐŽÐ°Ñ
crontab -r # ÑЎалОÑÑ ÑаблОÑÑ Ð·Ð°ÐŽÐ°Ñ
crontab path/to/file.crontab # загÑÑзОÑÑ ÑаблОÑÑ Ð·Ð°ÐŽÐ°Ñ ÐžÐ· Ñайла
á²á°áá crontab -e
á áá°á á ášá á«á£á¢ á°áááá ááµá¥ ášá°ááážá á áá³á á¥á
á áá áááá 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... 6], ášáµ 0 - á¥ááµ. ášáášášá»áᣠáµáµáµá°ááᣠááµá á áá°á áá ášáµááá á áµá°ááá ášááážá ááµáá ááá¢
á ááááªá«áá¹ á ááµáµ ááµá®áœ á¥áŽá¶áœ á áá á á°ášá ááášáá© ááœááá¡-
# заЎаÑа, вÑпПлМÑÐµÐŒÐ°Ñ Ð² пеÑвÑÑ Ðž ЎеÑÑÑÑÑ ÐŒÐžÐœÑÑÑ ÐºÐ°Ð¶ÐŽÐŸÐ³ÐŸ ÑаÑа
1,10 * * * * /path/to/exec -a -b -c
ááá á á°ášááá¡-
# заЎаÑа, вÑпПлМÑÐµÐŒÐ°Ñ Ð² кажЎÑÑ ÐžÐ· пеÑвÑÑ
ЎеÑÑÑО ЌОМÑÑ ÐºÐ°Ð¶ÐŽÐŸÐ³ÐŸ ÑаÑа
0-9 * * * * /path/to/exec -a -b -c
ášá°áá£á ááááá¥á ášá°á áá áá³ášá» á POSIX á cron.allow á¥á cron.deny áááᜠáá¥á¥á áá°ášáá á³á ᣠáá á á á á°á á°ášá°á ᣠáá®áá³á¥ áá³ášá» á«áážá á°á áááᜠá¥á ášáá®áá«á áá³ášá» ášááážá á°á ááááœá¢ ááµááá± ášá¥ááá á áááᜠáŠá³ á ááá ááá© á ááá£á ááá¢
ášá°ááá© áá®áá«ááœá£ á áá°á áá áá°ášáµá£ á¢á«ááµ á á«áµ ášá á«á£á¢ á°áááá®áœ ááá á áá£ážáá¢
- HOME ášá°á ááá ášá€áµ ááá« ááá¢
- LOGNAME - ášá°á áá ááá¢á«á¢
- PATH - áá°á ááá ášáµáááµ ááááá«ááœá ááááµ ášááœáá áµ ááááµ.
- SHELL áá° á°á ááá á áááµ ášáááµá°á ááááµ ááá¢
á á°áááᣠPOSIX ášá¥ááá á°áááá®áœ áááᜠášášáµ á¥áá°áá¡ ááá á áááááá¢
ááᥠá»á - Vixie áá®á 3.0pl1
ášá³áá áá®á á°ááá®áœ ášáá« á áµá á á«áµ á 3.0 á comp.sources.unix ášáááááµ áááá ááµá¥ ášá°áááá Vixie cron 1pl1992 ááᢠášáá á áµáªáµ áá áá á³áᜠá á áá áááá á¥áááášá³áá.
Vixie cron á áááµ áá®áá«áᜠ(áá®á á¥á áá®áá³á¥) ááá£á. á¥áá°á°ááá°á áŽáá ášá²áµá°á ášá°áá£á á áá ášá¥ á¥á ášááá°á¥ á°á áá ášá°áá£á á áá ášáŠáœá ášááá ᥠá¥á ášáááµ áááááµ á áá áµá£ ášáá®áá³á¥ ááááá« ášá°á áá á áá ášáŠáœá ášáášá áááááµ á áá áµá¢
ášá°áá£á á°áá ášá¥ á¥á ášáááá ááááœ
ášá±áá á°á ááá á°áá£á á°áá ášá¥ á /etc/crontab ááµá¥ áááá. ášáµáááµ á áá ášá¥ á áá£á¥ ášáªáá² áá®á á áá£á¥ áá áááá³áᣠáµáµáµá°áá á ááµ áá á°áá£á© ášá°ááášá áµá ášá°á áá áµá ášáááášá± á áµá°ááá¡-
# ÐапÑÑкаеÑÑÑ ÐµÐ¶ÐµÐŒÐžÐœÑÑМП ÐŸÑ Ð¿ÐŸÐ»ÑзПваÑÐµÐ»Ñ vlad
* * * * * vlad /path/to/exec
áá°á á ášá°á áá á°áá£á á áá ášáŠáœ á /var/cron/tabs/username ááµá¥ ááá«á á¥á ášáá« á áá£á¥ áá áááᢠᚠcrontab utility á¥áá° á°á áá áµá³ááµ ášááµá°á«ášááµ á¥ááá áááᜠáážáá¢
ášáá®áá³á¥ áá³ášá» á«áážá ášá°á áááᜠáááá®áœ ášáá°á³á°á©áµ á /var/cron/allow á¥á/var/cron/deny áááᜠááµá¥ á²áá ášá°á áá áµá á á°ááš ááµáá áá ááµáá£áµ á á ááá¢
ášá°á«áá á áá£á¥
áš POSIX áá®áá³á¥ áá á²áá»ážáᣠášáá áááµá áááµá ášááááá«áá ášá°áá£á á áá ášáŠáœ á áá£á¥ áá á áá³ááµ á á£á á áá áá»á»á«ááœá áááá¢
á á²áµ ášá°áá ášá¥ á áá£á¥ á°ááá á·áá¡ ááá³áá¡ ášá³ááá±á ááá ášáá«áµá áááµ á áµá (á°áᣠááá°á á¥á ášáá³á°ááµá) áááᜠáµáœááá á¢
# ÐапÑÑкаеÑÑÑ ÐµÐ¶ÐµÐŒÐžÐœÑÑМП пП пПМеЎелÑМОкаЌ О вÑПÑМОкаЌ в ÑМваÑе
* * * Jan Mon,Tue /path/to/exec
á°áá£á«áµ ášáááá©á áµá á°ášá áááᜠááœááá¡-
# ÐапÑÑкаеÑÑÑ Ñ ÑагПЌ в Ўве ЌОМÑÑÑ
*/2 * * * Mon,Tue /path/to/exec
á°ášááᜠá¥á ááá°á¶áœ áá°á£áá ááœáá-
# ÐапÑÑкаеÑÑÑ Ñ ÑагПЌ в Ўве ЌОМÑÑÑ Ð² пеÑвÑÑ
ЎеÑÑÑÑ ÐŒÐžÐœÑÑ ÐºÐ°Ð¶ÐŽÐŸÐ³ÐŸ ÑаÑа
0-10/2 * * * * /path/to/exec
áá°ááá°á á áá£á¥ ášáá³áá á áá«á®áœ áá°ááá (á³áá ááµáá³áµá£ ááá³áᣠááá³áᣠááááᣠá³ááá³áᣠá ášááᣠá¥á©á áááµá£ á ášá°áá±)
# ÐапÑÑкаеÑÑÑ Ð¿ÐŸÑле пеÑезагÑÑзкО ÑОÑÑеЌÑ
@reboot /exec/on/reboot
# ÐапÑÑкаеÑÑÑ Ñаз в ЎеМÑ
@daily /exec/daily
# ÐапÑÑкаеÑÑÑ Ñаз в ÑаÑ
@hourly /exec/daily
ášá°áá£á á áááá á á«á£á¢
Vixie cron ášá°ááá© áá°áá áªá«ááœá á á«á£á¢ á¥áá²ááá© á«áµáœááá³áá¢
ášá á«á£á¢ á°áááá®áœ USERᣠLOGNAME á¥á HOME á áŽáá á¥á» ášá°á°á¡ á áá°ááᣠááá áá ášááá ášá°áá°á± áážá
á áá³ááµ ášá á«á£á¢ á°áááá®áœ (á áááááµ SHELL á¥á HOME) áµá«á ááááá á á«á± áá®á áá áááᢠášá°á áá á°áá£á«áµá áááµá¬áµ ášáá£áªá sh ááá bashá áá áá áá áááµá á¥áá°ááœá á¥ááá¡-
SHELL=/bin/bash
HOME=/tmp/
# exec бÑÐŽÐµÑ Ð·Ð°Ð¿ÑÑеМ bash-еЌ в /tmp/
* * * * * /path/to/exec
áá á áµá® á á áá ášá¡ ááµá¥ ášá°ááá¹áµ ááá ášá á«á£á¢ á°áááá®áœ (á áá®á á¥á á áá ášááá ááá á áá°á± ášáááá) áá° á©á«á á¥á« áá°ááááá¢
ááááœá ááááµá áá®á³á¥ á VISUAL ááá EDITOR á á«á£á¢ á°áááá ááµá¥ ášá°ááážáá á áá³á áá áááᢠáá®áá³á¥ ášáá°á«á áµ á á«á£á¢ á¥ááá á°áááá®áœ á«áá°ááá¹á£ "/ usr/ucb/vi" á¥á á áá áááá (UCb áááá£áµ ášá«ááááá« á©áášáá²á²á£ á áááá áá)á¢
áá®á á áŽá¢á«á á¥á á á¡á¡áá±
áŽá¢á«á á¥á á°ááœáŠáᜠááá¢áᜠáááá
ášáµáᜠášááá³á©, áá á°ášá£á áááŠáœ - ášáá ášáµ áááᜠá¥á ášá°áá£á á áá ášáŠáœ ááá.
á áŽá¢á«á ááµá¥ á«á ášá°á áá á°áá ášáŠáœ á /var/spool/cron/crontabs ááá« ááµá¥ ááááá£ášáµáááµ á áá ášá¥ á ááá á á - á /etc/crontabᢠáŽá¢á«á áá¬á -á°á®á ášá°áá£á á áá ášáŠáœ á /etc/cron.d ááµá¥ á°ááá ááá£ášáá«á áá®á áŽáá á á«áµ-á°á á«áá£ážááᢠášá°á áá áá³ášá» áá¥á¥á ášáá°á³á°ášá á /etc/cron.allow á¥á /etc/cron.deny áááᜠááá¢
áá£áªá áŒá á ááá /á¢á/sh ááᣠá¥á±á á áŽá¢á«á ááµá¥ áµáᜠPOSIX ášáá«ášá¥á áŒá ááá¢
áá®á á¥á«á± á á áᥠáá ášáŽá¢á«á áµáªá¶áœ á áµáááµ ášáá°á« á²áá ášá áá áá á á /lib/systemd/system/cron.service ááµá¥ ááááᢠá á áááááµ áá á ááµá¥ ááá áá© ááá ášááᣠááááá ášá°á»á ášá°áá£á á áµá°á³á°á á á¥á«áá³áá± á°á áá áá®áá³á¥ ááµá¥ á áá¥á³ á á°ááá¹ ášá á«á£á¢ á°áááá®áœ á áá«áááµ áášááá ááœááá¢
áá®á á RedHatᣠFedora á¥á CentOS áá
áá£áªá áá á á á°ááá°á áŠá³áᜠáá áá: ášáµáááµ á áá ášá¥ á /etc/crontab, áá¬áᜠá ášáŽááá»ážáá á /etc/cron.d ááµá¥ á«áµááá£á, ášá°á áá á°áá ášáŠáœ áá° /var/spool/cron/crontabs ááá±.
áŽáá á á²áµá°ááµ áµá áá°á«áᣠášá áááááµ áá á /lib/systemd/system/crond.service ááá¢
á áá á®áá« áá°á áµááá¶áœ ááᣠáá£áªá á áá /bin/sh ááᣠá¥á±á áá°á á á£áœ ááᢠáá®á áµá«ááœá á / á¢á / sh á á©á á²á«áá± ášá£áœ áŒá á POSIX-compliant mode áááá«á á¥á ááá á°ášá᪠áá á á á«áá¥á, á ááá°ááá á£ááá ááá³ áá°á«á.
cronie á SLES á¥á openSUSE
ášáááá SLES áµááá± á¥á ášá±áŽ áŠáá áŠá á©á€áµá¢ á°ááœáŠ á«á áá®á áá áááᢠá¥áá á«áá áŽáá á¥áá²á á á²áµá°ááµ áµá áá°á«áᣠášá áááááµ áá á á /usr/lib/systemd/system/cron.service ááµá¥ ááᢠáá á: /etc/crontab, /etc/cron.d, /var/spool/cron/tabs. /á¢á/sh á POSIX-á áá«ášá¥á ááµá°áá¥á«á á£ááá ááá³ ášáá°á«á á°áá³á³á á£áœ ááá¢
Vixie cron áá³áªá«
ááááá áš cron áá®áœ áš Vixie cron áá á²áááá© á ášáá°á ááá³ á áá°ááá¡á, ááá áá á ááá ášáá®áá«áá áááᜠááášá³áµ ášááááá á á³á²áµ á£á áªá«áµá á ááá°áá. á á¥áááá¹ á¥ááá á á¥á«áᜠáá áážá á¥á á®á±á áá« á«áá£áᢠášááááªá«á ášáá®á ááá á®áµ á Paul Wixie áááá ᥠá áµá°á³áœ ááá¢
áµááá , áááá±á áš cron áááµ á ááá«áᜠášá°ááá° áá®áá«á - Vixie cron 3.0pl1 á áá áá áš cron áá³áªá«áá ááá°áá°á áá°áá©. áá£á¥á á áµážá᪠ášáá«á°áááµá á¢ááŽááœá á ááµáááµ á¥á ááá°á á°ášá áááá®áœá á áá°á áá³ááá¹á ááá á á°ááááá¢
ášá ááááµ á¥á« á á áá«á³ á°ášááᜠáášáá ááœáá.
- ášáá®áá«á á áááá.
- ááááµ ášá°áá£á®áœá áááá áá°á¥áµá¡ á¥á á«áááá¢
- ááá áš cron loop áµá«.
- á°áá£á ááááá¢
á á á°á á°ášá°á á¥áááážáá¢
á°áá³áœááµ
á ááá³á áµ áá ášáá°á±á áááá®áœ á«ášááá¡ á áá áá®á áš SIGCHLD á¥á ášSIGHUP ááááµ á°áá£á£áªááœá ááááᢠášááááªá«á áµá áá áá°áµ ááášá¥ ááá¢á«á ááááá£á ᣠááá°áá á°áá ášáááᥠááµá³áá»áá ááá ááá ááááá¢
signal(SIGCHLD, sigchld_handler);
signal(SIGHUP, sighup_handler);
á á²áµá°á ááµá¥ á«áá áá®á áŽáá áááá á¥á»áá áá°á«áᣠá á±áá á°á ááááµ áá á¥á ášááá áá®á ááá« ááµá¥ á¥á»á¢ ášáášá°ááµ á¥áªáᜠášá²áá áá°áµ PID áá ášááááá« ááá ááá¥á«áᣠá°á ááá áµááá áááá á«ášááá¡ á¥á ášá ááá ááá« áá° ááá ááá« áááá©áµá¢
acquire_daemonlock(0);
set_cron_uid();
set_cron_cwd();
áá£áªá á±á« á°ááá á·áᣠáá á áá°á¶áœá á²ááá© á¥á á áá ááááá¡-
setenv("PATH", _PATH_DEFPATH, 1);
á ááá á áá°á± "á³ááááµ" áá: á¹á« á áá°áá á¥á á áá áá°áµ ááµá¥ á á²áµ ááá áá (áŽá²áµ á áá°áá) ášáá°á±á ášáá á á ááá¥á«á. ášááá áá°áµ ášá áá á áá á á«áµáááá - á¥á ááá£áá¡-
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);
ášáá«á áá®á áá° ááá ášá¥á« áá°áµ ááá³á. ášáá« á ááµ áá ášá°áá£á áááá©á á²á«á áááášáµ á°áᢠááá¢
ášá°áá£á®áœá áááá áá°á¥á°á¥ á¥á áááá
ášááµ_á³á³á€á á°áá£á ášá°áá£á®áœá áááá ášáá«á áááááµ á áá áµá¢ áááá ášáµáááµ áá®á³á¥ á¥á ášá°á áá áááᜠááá«á áááµá»áᢠáááá¹ á¥á ááá«á á«áá°áášá©, ášá°áá£á áááá á¥áá°áá á áá°áá á á. á áá ááá« á á²áµ ášá°áá£á áááá ááá á áááá«á.
ášáµáááµ ááá á áá© ááá á¥á ášá°áá ášá¥ áµá á áá«á ááá¡-
/* еÑлО Ñайл ÑОÑÑеЌМПй ÑаблОÑÑ ÐžÐ·ÐŒÐµÐœÐžÐ»ÑÑ, пеÑеÑОÑÑваеЌ */
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);
}
ášáá« á áá, ášáµá®á ášááᥠáá³ á á á²áµ áá°á«á.
ášáá á£ááµ áá³ááᜠášáá°áµ_áá®áá³á¥ á¥áª ášá áá ášá¡ ášááá áµá áá ášááááµ á°á áá ááá©á á«ášááá£á (á±áá á°á áá á«ááá á áµá°áá) ášáá«á ááµ_á°á ááá áá°áááᢠášáááá á áµááµá áááá á ááµáá á ááµáá á«áá£áá¢
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;
}
}
á¥áá ááá ášá á«á£á¢ á°áááá (áá¥ášááááᜠá¥áá° VAR = á¥áŽáµ) á ááµ_á€á᪠/ env_set á°áá£á«áµ á°ááá á·á ᣠááá ášá°áá£á áááá«á (* * * * * / á±á«/to/exec) á ááµ_á¢ááµáª á°áá£á ááá á£áá¢
ááµ_áá€áµ ášáááá°á ášá á°áá£á ááᣠá¥á±á á á á ááá ášá°áá£á áááá ááµá¥ ášá°ááá áᢠá á°áá£á© á«á± ᣠášáá á ááá±á á áááµ áá°áá°á áášáááá ᣠáá ášá á«á£á¢ á°áááá®áœá á¥á ášá°áá£á ááµáááªá« áááªá«ááœá áááá á ášá áá ááááµ á ááá¢
/* пПлÑзПваÑÐµÐ»Ñ Ðž гÑÑппа ÐŽÐ»Ñ Ð·Ð°Ð¿ÑÑка заЎаÑО беÑÑÑÑÑ ÐžÐ· 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);
ášáµááááá ášá°áá£á áááá áá, ááá áá áá á«á.
áá áá
ášáµáªáµ 7 á©áááµ ášáá£á áŠáªá áá áá®á á ááá á°áá·áá¡ á áááá©á á loop áµáá á áá¥á§áᣠášá ááá á°áá á°áá£á«áµ á¥áá° á±ááá©áá ááá¯á á¥á á¥áµášááá¥áá á°áá ááááªá« áµášáµ á°áá·áᢠá á á®á ááœáᜠáá á«áá áá ááá á áá«ášá¥ á¥á áá¥á¶áœá áááááá¢
á SysV ááµá¥á£ á²áá ášáá°áá áµ á áá«á áµáªáµ ááá§á áá áµá«á á¥áµáš áááá á á áᥠá°áá áµášáµ ááá á30 á°ááááœá¢ á áá ááá³ ááµá¥ á«ááá áá ášáµ á¥áá°áá áááá ᥠá¥á áááá°áœ áá¥áá¶áœ á¥áá á ááááᣠááá áá ášá°áá£á®áœá áááá á áá¥ááµ áááá á áµážá᪠ááá¢
á 80 áá¹ ááá£á°á áá á áá°á á á©áááµ ááœáᜠáá á¥á á°ášá᪠áá¥á¶áœ áµááá á© Vixie áá®á áá° ášá°áá£á áááá®áœá áááá°áœ á á°áá á ááµ áá á°ááá°á¢
/* пеÑвОÑÐœÐ°Ñ Ð·Ð°Ð³ÑÑзка Ð·Ð°ÐŽÐ°Ñ */
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 (á°áá£á«áµá ááá á á¥á áááá) á¥á áµá¥ááá (á¥á«áá³áá±á ášááá°á¥ á°áá£á á áááá) á áá¥á«áµ ááᢠášáášášá»á á°áá£á á á áá áááá áá°áá°á á°áᢠáá.
á°áá£á áááá
ášá¶_áµááá á°áá£á á á¥á© á©áááµ áµá³áá áá ášáá°á«áᣠáááµáᣠá ááµá á°áá£á á á°áá³á°á ááá© áááµáážá á¹á« á«á°áááᢠášááá áá°áµ á°áá£á«áµá áášáááá ááá¥ááá£ášáá áá°áµ á°áá ášáµá« áá°á±á á²á«ááá á¡-
switch (fork()) {
case -1:
/*Ме ÑЌПглО вÑпПлМОÑÑ fork */
break;
case 0:
/* ЎПÑеÑМОй пÑПÑеÑÑ: Ма вÑÑкОй ÑлÑÑай еÑе Ñаз пÑПбÑеЌ заÑ
ваÑОÑÑ Ð³Ð»Ð°Ð²ÐœÑй лПк */
acquire_daemonlock(1);
/* пеÑеÑ
ПЎОЌ к ÑПÑЌОÑÐŸÐ²Ð°ÐœÐžÑ Ð¿ÑПÑеÑÑа заЎаÑО */
child_process(e, u);
/* пП завеÑÑÐµÐœÐžÑ ÐŽÐŸÑеÑМОй пÑПÑеÑÑ Ð·Ð°ÐºÐ°ÐœÑÐžÐ²Ð°ÐµÑ ÑабПÑÑ */
_exit(OK_EXIT);
break;
default:
/* ÑПЎОÑелÑÑкОй пÑПÑеÑÑ Ð¿ÑÐŸÐŽÐŸÐ»Ð¶Ð°ÐµÑ ÑабПÑÑ */
break;
}
á child_process ááµá¥ á¥á á áááá®áᜠá áá¡ áá°á ááá áá€áµ á¥á ášáµá á°áµ á¥ášá¶áœá á á«á± áááµá³áᣠáµááá á áá° á°á¥á³á€á á¥áá²áá (áš MAILTO á ášá£á¢ á°áááá á áµá«á á°áá ášá¥ ááµá¥ ášá°ááá) á¥á á áášášá»á áá á¥áá ášá¥á«á áá áá°áµ á¥áá²á ááá .
ášá¥á«á áá°áµ á áá á¹á« ááá°ášá³á-
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 á¥á áááá á áá«á®áœ á á-systemd-timers ááµá¥áµá¥ áµááá¶áœá ášá¥áááᜠáá á¥áá²á«á°á«á ááá áµááá³á ᣠá â¹fcron⺠ááµá¥ ášá°áá£á®áœá ášáá¥ááµ ááá³ ášá áá á á°áááá ááá³ ááµá°á«ášá ááœááᢠáá á áá á á£á ááá áá®áá³á¥ áá áá áá¥á á á ááá¢
á£áá© á©áááµá áá°á±á£ ááá áá®áá«ááœá á°á áá á¥á áá ááá á¥á á áµáá³ ááµášáá á!
ááá: hab.com