Cron ื‘ืœื™ื ื•ืงืก: ื”ื™ืกื˜ื•ืจื™ื”, ืฉื™ืžื•ืฉ ื•ืžื›ืฉื™ืจ

Cron ื‘ืœื™ื ื•ืงืก: ื”ื™ืกื˜ื•ืจื™ื”, ืฉื™ืžื•ืฉ ื•ืžื›ืฉื™ืจ

ื”ืงืœืืกื™ืงื” ื›ืชื‘ื” ืฉืฉืขื•ืช ืฉืžื—ื•ืช ืœื ืฆื•ืคื™ื. ื‘ื–ืžื ื™ื ื”ืคืจื•ืขื™ื ื”ื”ื ืœื ื”ื™ื• ืžืชื›ื ืชื™ื ื•ืœื ื™ื•ื ื™ืงืก, ืื‘ืœ ื”ื™ื•ื ืžืชื›ื ืชื™ื ื™ื•ื“ืขื™ื ื‘ื•ื•ื“ืื•ืช: cron ื™ืขืงื•ื‘ ืื—ืจ ื”ื–ืžืŸ ื‘ืžืงื•ืžื.

ื›ืœื™ ืขื–ืจ ืฉืœ ืฉื•ืจืช ื”ืคืงื•ื“ื” ื”ื ื’ื ื—ื•ืœืฉื” ื•ื’ื ืžื˜ืœื” ืขื‘ื•ืจื™. sed, awk, wc, cut ื•ืชื•ื›ื ื™ื•ืช ื™ืฉื ื•ืช ืื—ืจื•ืช ืžื•ืคืขืœื•ืช ืขืœ ื™ื“ื™ ืกืงืจื™ืคื˜ื™ื ื‘ืฉืจืชื™ื ืฉืœื ื• ืžื“ื™ ื™ื•ื. ืจื‘ื™ื ืžื”ื ืžืชื•ื›ื ื ื™ื ื›ืžืฉื™ืžื•ืช ืขื‘ื•ืจ cron, ืžืชื–ืžืŸ ื‘ืžืงื•ืจ ืžืฉื ื•ืช ื”-70.

ื‘ืžืฉืš ื–ืžืŸ ืจื‘ ื”ืฉืชืžืฉืชื™ ื‘-cron ื‘ืฆื•ืจื” ืฉื˜ื—ื™ืช, ืžื‘ืœื™ ืœื”ื™ื›ื ืก ืœืคืจื˜ื™ื, ืื‘ืœ ื™ื•ื ืื—ื“, ื›ืฉื ืชืงืœืชื™ ื‘ืฉื’ื™ืื” ื‘ื”ืคืขืœืช ืกืงืจื™ืคื˜, ื”ื—ืœื˜ืชื™ ืœื‘ื“ื•ืง ืืช ื–ื” ืœืขื•ืžืง. ื›ืš ื”ื•ืคื™ืข ื”ืžืืžืจ ื”ื–ื”, ืชื•ืš ื›ื“ื™ ื›ืชื™ื‘ืชื• ื”ื›ืจืชื™ ืืช POSIX crontab, ืืคืฉืจื•ื™ื•ืช ื”ืงืจื•ืŸ ื”ืขื™ืงืจื™ื•ืช ื‘ื”ืคืฆื•ืช ืœื™ื ื•ืงืก ืคื•ืคื•ืœืจื™ื•ืช ื•ืืช ื”ืžื‘ื ื” ืฉืœ ื—ืœืงืŸ.

ื”ืื ืืชื” ืžืฉืชืžืฉ ื‘ืœื™ื ื•ืงืก ื•ืžืคืขื™ืœ ืžืฉื™ืžื•ืช cron? ื”ืื ืืชื” ืžืชืขื ื™ื™ืŸ ื‘ืืจื›ื™ื˜ืงื˜ื•ืจืช ื™ื™ืฉื•ืžื™ ืžืขืจื›ืช ื‘ื™ื•ื ื™ืงืก? ืื– ืื ื—ื ื• ื‘ื“ืจืš!

ืชื•ื›ืŸ

ืžื•ืฆื ื”ืžื™ื ื™ื

ื”ืคืขืœื” ืชืงื•ืคืชื™ืช ืฉืœ ืชื•ื›ื ื™ื•ืช ืžืฉืชืžืฉ ืื• ืžืขืจื›ืช ื”ื™ื ื”ื›ืจื— ื‘ืจื•ืจ ื‘ื›ืœ ืžืขืจื›ื•ืช ื”ื”ืคืขืœื”. ืœื›ืŸ, ืžืชื›ื ืชื™ื ื”ื‘ื™ื ื• ืืช ื”ืฆื•ืจืš ื‘ืฉื™ืจื•ืชื™ื ื”ืžืืคืฉืจื™ื ืœื”ื ืœืชื›ื ืŸ ื•ืœื‘ืฆืข ืžืฉื™ืžื•ืช ื‘ืื•ืคืŸ ืžืจื›ื–ื™ ืœืคื ื™ ื–ืžืŸ ืจื‘.

ืžืขืจื›ื•ืช ื”ืคืขืœื” ื“ืžื•ื™ื•ืช Unix ืขื•ืงื‘ื•ืช ืื—ืจ ืžืงื•ืจื•ืชื™ื”ืŸ ืœื’ืจืกื” 7 Unix, ืฉืคื•ืชื—ื” ื‘ืฉื ื•ืช ื”-70 ืฉืœ ื”ืžืื” ื”ืงื•ื“ืžืช ื‘-Bell Labs, ื›ื•ืœืœ ืขืœ ื™ื“ื™ ืงืŸ ืชื•ืžืคืกื•ืŸ ื”ืžืคื•ืจืกื. ื’ืจืกื” 7 Unix ื›ืœืœื” ื’ื cron, ืฉื™ืจื•ืช ืœื”ืคืขืœืช ืžืฉื™ืžื•ืช ืžืฉืชืžืฉ-ืขืœ ื‘ืื•ืคืŸ ืงื‘ื•ืข.

ืงืจื•ืŸ ืžื•ื“ืจื ื™ ื˜ื™ืคื•ืกื™ ื”ื•ื ืชื•ื›ื ื” ืคืฉื•ื˜ื”, ืื‘ืœ ืืœื’ื•ืจื™ืชื ื”ื”ืคืขืœื” ืฉืœ ื”ื’ืจืกื” ื”ืžืงื•ืจื™ืช ื”ื™ื” ืืคื™ืœื• ืคืฉื•ื˜ ื™ื•ืชืจ: ื”ืฉื™ืจื•ืช ื”ืชืขื•ืจืจ ืคืขื ื‘ื“ืงื”, ืงืจื ื˜ื‘ืœื” ืขื ืžืฉื™ืžื•ืช ืžืงื•ื‘ืฅ ื‘ื•ื“ื“ (/etc/lib/crontab) ื•ื‘ื™ืฆืข ืขื‘ื•ืจ ืžืฉืชืžืฉ-ืขืœ ืืช ื”ืžืฉื™ืžื•ืช ืฉื”ื™ื• ืืžื•ืจื•ืช ืœื”ืชื‘ืฆืข ื‘ืจื’ืข ื”ื ื•ื›ื—ื™.

ืœืื—ืจ ืžื›ืŸ, ื’ืจืกืื•ืช ืžืฉื•ืคืจื•ืช ืฉืœ ื”ืฉื™ืจื•ืช ื”ืคืฉื•ื˜ ื•ื”ืฉื™ืžื•ืฉื™ ืกื•ืคืงื• ืขื ื›ืœ ืžืขืจื›ื•ืช ื”ื”ืคืขืœื” ื“ืžื•ื™ื•ืช ื™ื•ื ื™ืงืก.

ืชื™ืื•ืจื™ื ื›ืœืœื™ื™ื ืฉืœ ืคื•ืจืžื˜ crontab ื•ื”ืขืงืจื•ื ื•ืช ื”ื‘ืกื™ืกื™ื™ื ืฉืœ ืคืขื•ืœืช ื›ืœื™ ื”ืฉื™ืจื•ืช ื ื›ืœืœื• ื‘ืชืงืŸ ื”ืจืืฉื™ ืฉืœ ืžืขืจื›ื•ืช ื”ืคืขืœื” ื“ืžื•ื™ื•ืช Unix - POSIX - ื‘ืฉื ืช 1992, ื•ื›ืš ื”ืคืš cron ืžืชืงืŸ ื“ื” ืคืงื˜ื• ืœืชืงืŸ ื“ื” ื™ื•ืจื”.

ื‘ืฉื ืช 1987, ืคื•ืœ Vixie, ืœืื—ืจ ืฉืกืงืจ ืืช ืžืฉืชืžืฉื™ ื™ื•ื ื™ืงืก ืœื’ื‘ื™ ืจืฆื•ื ื•ืชื™ื”ื ืขื‘ื•ืจ cron, ื”ื•ืฆื™ื ื’ืจืกื” ื ื•ืกืคืช ืฉืœ ื”ื“ืžื•ืŸ ืฉืชื™ืงื ื” ื—ืœืง ืžื”ื‘ืขื™ื•ืช ืฉืœ cron ื”ืžืกื•ืจืชื™ ื•ื”ืจื—ื™ื‘ื” ืืช ื”ืชื—ื‘ื™ืจ ืฉืœ ืงื‘ืฆื™ ื˜ื‘ืœื”.

ื‘ื’ืจืกื” ื”ืฉืœื™ืฉื™ืช ืฉืœ Vixie cron ื”ื—ืœื” ืœืขืžื•ื“ ื‘ื“ืจื™ืฉื•ืช POSIX, ื‘ื ื•ืกืฃ, ืœืชื•ื›ื ื™ืช ื”ื™ื” ืจื™ืฉื™ื•ืŸ ืœื™ื‘ืจืœื™, ืื• ืœื™ืชืจ ื“ื™ื•ืง ืœื ื”ื™ื” ืจื™ืฉื™ื•ืŸ ื›ืœืœ, ืœืžืขื˜ ื”ืžืฉืืœื•ืช ื‘-README: ื”ืžื—ื‘ืจ ืื™ื ื• ื ื•ืชืŸ ืขืจื‘ื•ื™ื•ืช, ืฉื ื”ืžื—ื‘ืจ ืœื ื ื™ืชืŸ ืœืžื—ื•ืง, ื•ื”ืชื•ื›ื ื™ืช ื™ื›ื•ืœื” ืœื”ื™ืžื›ืจ ืจืง ื™ื—ื“ ืขื ืงื•ื“ ืžืงื•ืจ. ื”ื“ืจื™ืฉื•ืช ื”ืœืœื• ื”ืชื‘ืจืจื• ื›ืชื•ืืžื•ืช ืœืขืงืจื•ื ื•ืช ื”ืชื•ื›ื ื” ื”ื—ื•ืคืฉื™ืช ืฉืฆื‘ืจื• ืคื•ืคื•ืœืจื™ื•ืช ื‘ืื•ืชืŸ ืฉื ื™ื, ื›ืš ืฉื—ืœืง ืžื”ื”ืคืฆื•ืช ื”ืžืจื›ื–ื™ื•ืช ืฉืœ ืœื™ื ื•ืงืก ืฉื”ื•ืคื™ืขื• ื‘ืชื—ื™ืœืช ืฉื ื•ืช ื”-90 ืœืงื—ื• ืืช Vixie cron ื›ืžืขืจื›ืช ืื—ืช ืฉืœื”ื ื•ืขื“ื™ื™ืŸ ืžืคืชื—ื•ืช ืื•ืชื” ื›ื™ื•ื.

ื‘ืžื™ื•ื—ื“, Red Hat ื•-SUSE ืžืคืชื—ื™ื ืžื–ืœื’ ืฉืœ Vixie cron - cron, ื•ื“ื‘ื™ืืŸ ื•ืื•ื‘ื•ื ื˜ื• ืžืฉืชืžืฉื•ืช ื‘ืžื”ื“ื•ืจื” ื”ืžืงื•ืจื™ืช ืฉืœ Vixie cron ืขื ืชื™ืงื•ื ื™ื ืจื‘ื™ื.

ื‘ื•ืื• ื ื›ื™ืจ ืชื—ื™ืœื” ืืช ื”-User Utility crontab ื”ืžืชื•ืืจ ื‘-POSIX, ื•ืœืื—ืจ ืžื›ืŸ ื ื‘ื—ืŸ ืืช ื”ืจื—ื‘ื•ืช ื”ืชื—ื‘ื™ืจ ื”ื ื™ืชื ื•ืช ื‘-Vixie cron ื•ืืช ื”ืฉื™ืžื•ืฉ ื‘ื•ื•ืจื™ืืฆื™ื•ืช ืฉืœ Vixie cron ื‘ื”ืคืฆื•ืช ืœื™ื ื•ืงืก ืคื•ืคื•ืœืจื™ื•ืช. ื•ืœื‘ืกื•ืฃ, ื”ื“ื•ื‘ื“ื‘ืŸ ืฉืขืœ ื”ืขื•ื’ื” ื”ื•ื ื”ื ื™ืชื•ื— ืฉืœ ืžื›ืฉื™ืจ ื”ืงืจื•ืŸ ื“ืžื•ืŸ.

POSIX crontab

ืื ื”ืงืจื•ืŸ ื”ืžืงื•ืจื™ ืชืžื™ื“ ืขื‘ื“ ืขื‘ื•ืจ ืžืฉืชืžืฉ ื”ืขืœ, ืžืชื–ืžื ื™ื ืžื•ื“ืจื ื™ื™ื ืžืชืžื•ื“ื“ื™ื ืœืขืชื™ื ืงืจื•ื‘ื•ืช ืขื ืžืฉื™ืžื•ืช ืฉืœ ืžืฉืชืžืฉื™ื ืจื’ื™ืœื™ื, ื•ื–ื” ื‘ื˜ื•ื— ื•ื ื•ื— ื™ื•ืชืจ.

Crons ืžืกื•ืคืงื™ื ื›ืกื˜ ืฉืœ ืฉืชื™ ืชื•ื›ื ื™ื•ืช: ื“ืžื•ืŸ ื”-cron ื”ืคื•ืขืœ ืœืœื ื”ืจืฃ ื•ื›ืœื™ ื”ืฉื™ืจื•ืช crontab ื”ื–ืžื™ื ื” ืœืžืฉืชืžืฉื™ื. ื”ืื—ืจื•ืŸ ืžืืคืฉืจ ืœืš ืœืขืจื•ืš ื˜ื‘ืœืื•ืช ืžืฉื™ืžื•ืช ืกืคืฆื™ืคื™ื•ืช ืœื›ืœ ืžืฉืชืžืฉ ื‘ืžืขืจื›ืช, ื‘ืขื•ื“ ื”ื“ืžื•ืŸ ืžืฉื™ืง ืžืฉื™ืžื•ืช ืžื˜ื‘ืœืื•ืช ืžืฉืชืžืฉ ื•ืžืขืจื›ืช.

ะ’ ืชืงืŸ POSIX ื”ื”ืชื ื”ื’ื•ืช ืฉืœ ื”ื“ืžื•ืŸ ืื™ื ื” ืžืชื•ืืจืช ื‘ืฉื•ื ืฆื•ืจื” ื•ืจืง ืชื•ื›ื ื™ืช ื”ืžืฉืชืžืฉ ืจืฉืžื™ืช crontab. ืงื™ื•ืžื ืฉืœ ืžื ื’ื ื•ื ื™ื ืœื”ืคืขืœืช ืžืฉื™ืžื•ืช ืžืฉืชืžืฉ ืžืฉืชืžืข, ื›ืžื•ื‘ืŸ, ืืš ืื™ื ื• ืžืชื•ืืจ ื‘ืคื™ืจื•ื˜.

ืขืœ ื™ื“ื™ ืงืจื™ืื” ืœื›ืœื™ ื”ืฉื™ืจื•ืช crontab, ืืชื” ื™ื›ื•ืœ ืœืขืฉื•ืช ืืจื‘ืขื” ื“ื‘ืจื™ื: ืœืขืจื•ืš ืืช ื˜ื‘ืœืช ื”ืžืฉื™ืžื•ืช ืฉืœ ื”ืžืฉืชืžืฉ ื‘ืขื•ืจืš, ืœื˜ืขื•ืŸ ืืช ื”ื˜ื‘ืœื” ืžืงื•ื‘ืฅ, ืœื”ืฆื™ื’ ืืช ื˜ื‘ืœืช ื”ืžืฉื™ืžื•ืช ื”ื ื•ื›ื—ื™ืช ื•ืœื ืงื•ืช ืืช ื˜ื‘ืœืช ื”ืžืฉื™ืžื•ืช. ื“ื•ื’ืžืื•ืช ืœืื•ืคืŸ ื”ืคืขื•ืœื” ืฉืœ ื›ืœื™ ื”ืฉื™ืจื•ืช 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, ื”ืžืคืจื˜ื™ื ืžืฉืชืžืฉื™ื ืขื ื’ื™ืฉื” ืœ-crontab ื•ืžืฉืชืžืฉื™ื ืœืœื ื’ื™ืฉื” ืœืชื•ื›ื ื™ืช, ื‘ื”ืชืืžื”. ื”ืชืงืŸ ืื™ื ื• ืžืกื“ื™ืจ ืืช ืžื™ืงื•ื ื”ืงื‘ืฆื™ื ื”ืœืœื• ื‘ืฉื•ื ืื•ืคืŸ.

ืขืœ ืคื™ ื”ืชืงืŸ, ื™ืฉ ืœื”ืขื‘ื™ืจ ืœืคื—ื•ืช ืืจื‘ืขื” ืžืฉืชื ื™ ืกื‘ื™ื‘ื” ืœืชื•ื›ื ื™ื•ืช ืฉื”ื•ืฉืงื•:

  1. HOME - ืกืคืจื™ื™ืช ื”ื‘ื™ืช ืฉืœ ื”ืžืฉืชืžืฉ.
  2. LOGNAME - ื”ืชื—ื‘ืจื•ืช ืžืฉืชืžืฉ.
  3. PATH ื”ื•ื ื”ื ืชื™ื‘ ืฉื‘ื• ืืชื” ื™ื›ื•ืœ ืœืžืฆื•ื ื›ืœื™ ืขื–ืจ ืกื˜ื ื“ืจื˜ื™ื™ื ืœืžืขืจื›ืช.
  4. SHELL - ื ืชื™ื‘ ืืœ ืžืชื•ืจื’ืžืŸ ื”ืคืงื•ื“ื•ืช ื‘ืฉื™ืžื•ืฉ.

ื™ืฉ ืœืฆื™ื™ืŸ, POSIX ืœื ืื•ืžืจ ื“ื‘ืจ ืขืœ ืžื”ื™ื›ืŸ ืžื’ื™ืขื™ื ื”ืขืจื›ื™ื ืฉืœ ืžืฉืชื ื™ื ืืœื”.

ื”ื ืžื›ืจ ื‘ื™ื•ืชืจ - Vixie cron 3.0pl1

ื”ืื‘ ื”ืงื“ืžื•ืŸ ื”ืžืฉื•ืชืฃ ืฉืœ ื’ืจืกืื•ืช ืงืจื•ืŸ ืคื•ืคื•ืœืจื™ื•ืช ื”ื•ื Vixie cron 3.0pl1, ืฉื”ื•ืฆื’ ื‘ืจืฉื™ืžืช ื”ืชืคื•ืฆื” comp.sources.unix ื‘-1992. ื ืฉืงื•ืœ ืืช ื”ืชื›ื•ื ื•ืช ื”ืขื™ืงืจื™ื•ืช ืฉืœ ื’ืจืกื” ื–ื• ื‘ื™ืชืจ ืคื™ืจื•ื˜.

Vixie cron ืžื’ื™ืข ื‘ืฉืชื™ ืชื•ื›ื ื™ื•ืช (cron ื•-crontab). ื›ืจื’ื™ืœ, ื”ื“ืžื•ืŸ ืื—ืจืื™ ืขืœ ืงืจื™ืื” ื•ื”ืจืฆื” ืฉืœ ืžืฉื™ืžื•ืช ืžื˜ื‘ืœืช ื”ืžืฉื™ืžื•ืช ืฉืœ ื”ืžืขืจื›ืช ื•ืžื˜ื‘ืœืื•ืช ืžืฉื™ืžื•ืช ืžืฉืชืžืฉ ื‘ื•ื“ื“ื•ืช, ื•ื›ืœื™ ื”ืฉื™ืจื•ืช crontab ืื—ืจืื™ ืœืขืจื™ื›ืช ื˜ื‘ืœืื•ืช ืžืฉืชืžืฉื™ื.

ื˜ื‘ืœืช ืžืฉื™ืžื•ืช ื•ืงื‘ืฆื™ ืชืฆื•ืจื”

ื˜ื‘ืœืช ื”ืžืฉื™ืžื•ืช ืฉืœ ืžืฉืชืžืฉ-ืขืœ ืžืžื•ืงืžืช ื‘-/etc/crontab. ื”ืชื—ื‘ื™ืจ ืฉืœ ื˜ื‘ืœืช ื”ืžืขืจื›ืช ืžืชืื™ื ืœืชื—ื‘ื™ืจ ืฉืœ Vixie cron, ืœืžืขื˜ ืฉื”ืขืžื•ื“ื” ื”ืฉื™ืฉื™ืช ื‘ื” ืžืฆื™ื™ื ืช ืืช ืฉื ื”ืžืฉืชืžืฉ ืฉืชื—ืชื™ื• ื”ืžืฉื™ืžื” ืžื•ืคืขืœืช:

# ะ—ะฐะฟัƒัะบะฐะตั‚ัั ะตะถะตะผะธะฝัƒั‚ะฝะพ ะพั‚ ะฟะพะปัŒะทะพะฒะฐั‚ะตะปั vlad
* * * * * vlad /path/to/exec

ื˜ื‘ืœืื•ืช ืžืฉื™ืžื•ืช ืžืฉืชืžืฉ ืจื’ื™ืœื•ืช ืžืžื•ืงืžื•ืช ื‘- /var/cron/tabs/username ื•ืžืฉืชืžืฉื•ืช ื‘ืื•ืชื• ืชื—ื‘ื™ืจ. ื›ืืฉืจ ืืชื” ืžืคืขื™ืœ ืืช ื›ืœื™ ื”ืฉื™ืจื•ืช crontab ื›ืžืฉืชืžืฉ, ืืœื• ื”ื ื”ืงื‘ืฆื™ื ืฉื ืขืจื›ื™ื.

ืจืฉื™ืžื•ืช ื”ืžืฉืชืžืฉื™ื ืขื ื’ื™ืฉื” ืœ-crontab ืžื ื•ื”ืœื•ืช ื‘ืงื‘ืฆื™ื /var/cron/allow ื•-/var/cron/deny, ืฉื ืืชื” ืจืง ืฆืจื™ืš ืœื”ื–ื™ืŸ ืืช ืฉื ื”ืžืฉืชืžืฉ ื‘ืฉื•ืจื” ื ืคืจื“ืช.

ืชื—ื‘ื™ืจ ืžื•ืจื—ื‘

ื‘ื”ืฉื•ื•ืื” ืœ- POSIX crontab, ื”ืคืชืจื•ืŸ ืฉืœ Paul Vixey ืžื›ื™ืœ ืžืกืคืจ ืฉื™ื ื•ื™ื™ื ืฉื™ืžื•ืฉื™ื™ื ืžืื•ื“ ืœืชื—ื‘ื™ืจ ืฉืœ ื˜ื‘ืœืื•ืช ื”ืžืฉื™ืžื•ืช ืฉืœ ื›ืœื™ ื”ืฉื™ืจื•ืช.

ืชื—ื‘ื™ืจ ื˜ื‘ืœื” ื—ื“ืฉ ื”ืคืš ืœื–ืžื™ืŸ: ืœื“ื•ื’ืžื”, ืืชื” ื™ื›ื•ืœ ืœืฆื™ื™ืŸ ื™ืžื™ื ื‘ืฉื‘ื•ืข ืื• ื—ื•ื“ืฉื™ื ืœืคื™ ืฉื (ืฉื ื™, ื’' ื•ื›ืŸ ื”ืœืื”):

# ะ—ะฐะฟัƒัะบะฐะตั‚ัั ะตะถะตะผะธะฝัƒั‚ะฝะพ ะฟะพ ะฟะพะฝะตะดะตะปัŒะฝะธะบะฐะผ ะธ ะฒั‚ะพั€ะฝะธะบะฐะผ ะฒ ัะฝะฒะฐั€ะต
* * * 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 ืื™ื ื ืžืกื•ืคืงื™ื ืจืง ืขืœ ื™ื“ื™ ื”ื“ืžื•ืŸ, ืืœื ืœืงื•ื—ื™ื ืžืงื•ื‘ืฅ ืคืกื—. ื”ืžืฉืชื ื” PATH ืžื•ื’ื“ืจ ืœ-"/usr/bin:/bin" ื•ื”ืžืฉืชื ื” SHELL ืžื•ื’ื“ืจ ืœ-"/bin/sh". ื ื™ืชืŸ ืœืฉื ื•ืช ืืช ื”ืขืจื›ื™ื ืฉืœ ื›ืœ ื”ืžืฉืชื ื™ื ืžืœื‘ื“ LOGNAME ื‘ื˜ื‘ืœืื•ืช ืžืฉืชืžืฉ.

ืžืฉืชื ื™ ืกื‘ื™ื‘ื” ืžืกื•ื™ืžื™ื (ื‘ืขื™ืงืจ SHELL ื•-HOME) ืžืฉืžืฉื™ื ืืช cron ืขืฆืžื” ืœื”ืคืขืœืช ื”ืžืฉื™ืžื”. ื›ืš ืขืฉื•ื™ ืœื”ื™ืจืื•ืช ืฉื™ืžื•ืฉ ื‘-bash ื‘ืžืงื•ื ื‘-sh ืจื’ื™ืœ ืœื”ืคืขืœืช ืžืฉื™ืžื•ืช ืžื•ืชืืžื•ืช ืื™ืฉื™ืช:

SHELL=/bin/bash
HOME=/tmp/
# exec ะฑัƒะดะตั‚ ะทะฐะฟัƒั‰ะตะฝ bash-ะตะผ ะฒ /tmp/
* * * * * /path/to/exec

ื‘ืกื•ืคื• ืฉืœ ื“ื‘ืจ, ื›ืœ ืžืฉืชื ื™ ื”ืกื‘ื™ื‘ื” ื”ืžื•ื’ื“ืจื™ื ื‘ื˜ื‘ืœื” (ื‘ืฉื™ืžื•ืฉ ืขืœ ื™ื“ื™ cron ืื• ื”ื“ืจื•ืฉื™ื ื‘ืชื”ืœื™ืš) ื™ื•ืขื‘ืจื• ืœืžืฉื™ืžื” ื”ืคื•ืขืœืช.

ื›ื“ื™ ืœืขืจื•ืš ืงื‘ืฆื™ื, crontab ืžืฉืชืžืฉ ื‘ืขื•ืจืš ืฉืฆื•ื™ืŸ ื‘ืžืฉืชื ื” ื”ืกื‘ื™ื‘ื” VISUAL ืื• EDITOR. ืื ื”ืกื‘ื™ื‘ื” ืฉื‘ื” ื‘ื•ืฆืขื” crontab ืœื ืžื’ื“ื™ืจื™ื ืืช ื”ืžืฉืชื ื™ื ื”ืืœื”, ืื– ื ืขืฉื” ืฉื™ืžื•ืฉ ื‘-"/usr/ucb/vi" (ucb ื”ื™ื ื›ื ืจืื” ืื•ื ื™ื‘ืจืกื™ื˜ืช ืงืœื™ืคื•ืจื ื™ื”, ื‘ืจืงืœื™).

cron ืขืœ ื“ื‘ื™ืืŸ ื•ืื•ื‘ื•ื ื˜ื•

ื”ืžืคืชื—ื™ื ืฉืœ Debian ื•ื”ืคืฆื•ืช ื ื’ื–ืจื•ืช ืคืจืกืžื• ื’ืจืกื” ืฉื•ื ื” ืžืื•ื“ Vixie cron ื’ืจืกื” 3.0pl1. ืื™ืŸ ื”ื‘ื“ืœื™ื ื‘ืชื—ื‘ื™ืจ ืฉืœ ืงื‘ืฆื™ ื˜ื‘ืœื”; ืขื‘ื•ืจ ืžืฉืชืžืฉื™ื ื–ื” ืื•ืชื• Vixie cron. ื”ืชื›ื•ื ื” ื”ื—ื“ืฉื” ื”ื’ื“ื•ืœื” ื‘ื™ื•ืชืจ: ืชืžื™ื›ื” syslog, SELinux ะธ PAM.

ืฉื™ื ื•ื™ื™ื ืคื—ื•ืช ื‘ื•ืœื˜ื™ื ืืš ืžื•ื—ืฉื™ื™ื ื›ื•ืœืœื™ื ืืช ื”ืžื™ืงื•ื ืฉืœ ืงื‘ืฆื™ ืชืฆื•ืจื” ื•ื˜ื‘ืœืื•ืช ืžืฉื™ืžื•ืช.

ื˜ื‘ืœืื•ืช ืžืฉืชืžืฉ ื‘ื“ื‘ื™ืืŸ ืžืžื•ืงืžื•ืช ื‘ืกืคืจื™ื™ืช /var/spool/cron/crontabs, ื˜ื‘ืœืช ื”ืžืขืจื›ืช ืขื“ื™ื™ืŸ ืฉื - ื‘- /etc/crontab. ื˜ื‘ืœืื•ืช ืžืฉื™ืžื•ืช ืกืคืฆื™ืคื™ื•ืช ืœื—ื‘ื™ืœื•ืช ื“ื‘ื™ืืŸ ืžืžื•ืงืžื•ืช ื‘-/etc/cron.d, ืžืฉื ื“ืžื•ืŸ ื”-cron ืงื•ืจื ืื•ืชืŸ ืื•ื˜ื•ืžื˜ื™ืช. ื‘ืงืจืช ื’ื™ืฉืช ื”ืžืฉืชืžืฉ ื ืฉืœื˜ืช ืขืœ ื™ื“ื™ ื”ืงื‘ืฆื™ื /etc/cron.allow ื•-/etc/cron.deny.

ืžืขื˜ืคืช ื‘ืจื™ืจืช ื”ืžื—ื“ืœ ื”ื™ื ืขื“ื™ื™ืŸ /bin/sh, ืืฉืจ ื‘ื“ื‘ื™ืืŸ ื”ื™ื ืžืขื˜ืคืช ืงื˜ื ื” ืชื•ืืžืช POSIX ืงื•ืจื˜ื•ื‘, ื”ื•ืฉืง ืœืœื ืงืจื™ืืช ืชืฆื•ืจื” ื›ืœืฉื”ื™ (ื‘ืžืฆื‘ ืœื ืื™ื ื˜ืจืืงื˜ื™ื‘ื™).

Cron ืขืฆืžื• ื‘ื’ืจืกืื•ืช ื”ืื—ืจื•ื ื•ืช ืฉืœ ื“ื‘ื™ืืŸ ืžื•ืฉืง ื‘ืืžืฆืขื•ืช systemd, ื•ื ื™ืชืŸ ืœืจืื•ืช ืืช ืชืฆื•ืจืช ื”ื”ืฉืงื” ื‘-/lib/systemd/system/cron.service. ืื™ืŸ ืฉื•ื ื“ื‘ืจ ืžื™ื•ื—ื“ ื‘ืชืฆื•ืจืช ื”ืฉื™ืจื•ืช; ื›ืœ ื ื™ื”ื•ืœ ืžืฉื™ืžื•ืช ืขื“ื™ืŸ ื™ื•ืชืจ ื™ื›ื•ืœ ืœื”ืชื‘ืฆืข ื‘ืืžืฆืขื•ืช ืžืฉืชื ื™ ืกื‘ื™ื‘ื” ื”ืžื•ืฆื”ืจื™ื ื™ืฉื™ืจื•ืช ื‘-crontab ืฉืœ ื›ืœ ืžืฉืชืžืฉ.

ืžืงื•ืจื‘ ื‘-RedHat, Fedora ื•- CentOS

ืงืจื•ื ื™ - ืžื–ืœื’ ืฉืœ Vixie cron ื’ืจืกื” 4.1. ื›ืžื• ื‘ื“ื‘ื™ืืŸ, ื”ืชื—ื‘ื™ืจ ืœื ื”ืฉืชื ื”, ืืš ื ื•ืกืคื” ืชืžื™ื›ื” ื‘-PAM ื•-SELinux, ืขื‘ื•ื“ื” ื‘ืืฉื›ื•ืœ, ืžืขืงื‘ ืื—ืจ ืงื‘ืฆื™ื ื‘ืืžืฆืขื•ืช inotify ื•ืชื›ื•ื ื•ืช ื ื•ืกืคื•ืช.

ืชืฆื•ืจืช ื‘ืจื™ืจืช ื”ืžื—ื“ืœ ื”ื™ื ื‘ืžืงื•ืžื•ืช ื”ืจื’ื™ืœื™ื: ื˜ื‘ืœืช ื”ืžืขืจื›ืช ื ืžืฆืืช ื‘-/etc/crontab, ื—ื‘ื™ืœื•ืช ืฉืžื•ืช ืืช ื”ื˜ื‘ืœืื•ืช ืฉืœื”ืŸ ื‘-/etc/cron.d, ื˜ื‘ืœืื•ืช ืžืฉืชืžืฉ ื ื›ื ืกื•ืช ืœ-/var/spool/cron/crontabs.

ื”ื“ืžื•ืŸ ืคื•ืขืœ ืชื—ืช ื‘ืงืจืช ืžืขืจื›ืช, ืชืฆื•ืจืช ื”ืฉื™ืจื•ืช ื”ื™ื /lib/systemd/system/crond.service.

ื‘ื”ืคืฆื•ืช ื“ืžื•ื™ื•ืช Red Hat, /bin/sh ืžืฉืžืฉ ื›ื‘ืจื™ืจืช ืžื—ื“ืœ ื‘ืขืช ื”ื”ืคืขืœื”, ืฉื”ื•ื ื”-bash ื”ืกื˜ื ื“ืจื˜ื™. ื™ืฉ ืœืฆื™ื™ืŸ ื›ื™ ื‘ืขืช ื”ืคืขืœืช ืžืฉื™ืžื•ืช cron ื“ืจืš /bin/sh, ืžืขื˜ืคืช ื”-bash ืžืชื—ื™ืœื” ื‘ืžืฆื‘ ืชื•ืื POSIX ื•ืื™ื ื” ืงื•ืจืืช ื›ืœ ืชืฆื•ืจื” ื ื•ืกืคืช, ืคื•ืขืœืช ื‘ืžืฆื‘ ืœื ืื™ื ื˜ืจืืงื˜ื™ื‘ื™.

ืžืงื•ืจื‘ ื‘-SLES ื•ื‘-openSUSE

ื”ื”ืคืฆื” ื”ื’ืจืžื ื™ืช SLES ื•ื”ื ื’ื–ืจืช ืฉืœื” openSUSE ืžืฉืชืžืฉื•ืช ื‘ืื•ืชื• ืžืงื•ืจื‘. ื”ื“ืžื•ืŸ ื›ืืŸ ืžื•ืคืขืœ ื’ื ืชื—ืช systemd, ืชืฆื•ืจืช ื”ืฉื™ืจื•ืช ืžืžื•ืงืžืช ื‘- /usr/lib/systemd/system/cron.service. ืชืฆื•ืจื”: /etc/crontab, /etc/cron.d, /var/spool/cron/tabs. /bin/sh ื”ื•ื ืื•ืชื• bash ื”ืคื•ืขืœ ื‘ืžืฆื‘ ืœื ืื™ื ื˜ืจืืงื˜ื™ื‘ื™ ืชื•ืื POSIX.

ืžื›ืฉื™ืจ Vixie cron

ืฆืืฆืื™ื• ื”ืžื•ื“ืจื ื™ื™ื ืฉืœ cron ืœื ื”ืฉืชื ื• ื‘ืื•ืคืŸ ืงื™ืฆื•ื ื™ ื‘ื”ืฉื•ื•ืื” ืœ-Vixie cron, ืืš ืขื“ื™ื™ืŸ ืจื›ืฉื• ืชื›ื•ื ื•ืช ื—ื“ืฉื•ืช ืฉืื™ื ืŸ ื ื“ืจืฉื•ืช ื›ื“ื™ ืœื”ื‘ื™ืŸ ืืช ืขืงืจื•ื ื•ืช ื”ืชื•ื›ื ื™ืช. ืจื‘ื™ื ืžื”ื”ืจื—ื‘ื•ืช ื”ืœืœื• ืžืขื•ืฆื‘ื•ืช ื‘ืฆื•ืจื” ื’ืจื•ืขื” ื•ืžื‘ืœื‘ืœื•ืช ืืช ื”ืงื•ื“. ืชืขื ื•ื’ ืœืงืจื•ื ืืช ืงื•ื“ ืžืงื•ืจ ื”ืงืจื•ืŸ ื”ืžืงื•ืจื™ ืžืืช ืคื•ืœ ื•ื™ืงืกื™.

ืœื›ืŸ, ื”ื—ืœื˜ืชื™ ืœื ืชื— ืืช ืžื›ืฉื™ืจ ื”-cron ื‘ืืžืฆืขื•ืช ื”ื“ื•ื’ืžื” ืฉืœ ืชื•ื›ื ื™ืช cron ื”ืžืฉื•ืชืคืช ืœืฉื ื™ ืขื ืคื™ ื”ืคื™ืชื•ื— - Vixie cron 3.0pl1. ืื ื™ ืืคืฉื˜ ืืช ื”ื“ื•ื’ืžืื•ืช ืขืœ ื™ื“ื™ ื”ืกืจืช ifdefs ืฉืžืกื‘ื›ื™ื ืืช ื”ืงืจื™ืื” ื•ื”ืฉืžื˜ืช ืคืจื˜ื™ื ืงื˜ื ื™ื.

ื ื™ืชืŸ ืœื—ืœืง ืืช ืขื‘ื•ื“ืช ื”ืฉื“ ืœืžืกืคืจ ืฉืœื‘ื™ื:

  1. ืืชื—ื•ืœ ื”ืชื•ื›ื ื™ืช.
  2. ืื™ืกื•ืฃ ื•ืขื“ื›ื•ืŸ ืจืฉื™ืžืช ื”ืžืฉื™ืžื•ืช ืœื”ืคืขืœื”.
  3. ืœื•ืœืืช ืงืจื•ืŸ ืจืืฉื™ืช ืคื•ืขืœืช.
  4. ื”ืชื—ืœ ืžืฉื™ืžื”.

ื‘ื•ืื• ื ืกืชื›ืœ ืขืœื™ื”ื ืœืคื™ ื”ืกื“ืจ.

ืืชื—ื•ืœ

ื›ืืฉืจ ืžืชื—ื™ืœื™ื, ืœืื—ืจ ื‘ื“ื™ืงืช ืืจื’ื•ืžื ื˜ื™ ื”ืชื”ืœื™ืš, cron ืžืชืงื™ืŸ ืืช ืžื˜ืคืœื™ ื”ืื•ืชื•ืช SIGCHLD ื•-SIGHUP. ื”ืจืืฉื•ืŸ ืขื•ืจืš ืจื™ืฉื•ื ื‘ื™ื•ืžืŸ ืœื’ื‘ื™ ืกื™ื•ื ืชื”ืœื™ืš ื”ืฆืืฆื, ื”ืฉื ื™ ืกื•ื’ืจ ืืช ืžืชืืจ ื”ืงื•ื‘ืฅ ืฉืœ ืงื•ื‘ืฅ ื”ื™ื•ืžืŸ:

signal(SIGCHLD, sigchld_handler);
signal(SIGHUP, sighup_handler);

ื”-cron daemon ืชืžื™ื“ ืคื•ืขืœ ืœื‘ื“ ืขืœ ื”ืžืขืจื›ืช, ืจืง ื‘ืชื•ืจ ืžืฉืชืžืฉ-ืขืœ ื•ืžืชื™ืงื™ื™ืช ื”-cron ื”ืจืืฉื™ืช. ื”ืฉื™ื—ื•ืช ื”ื‘ืื•ืช ื™ื•ืฆืจื•ืช ืงื•ื‘ืฅ ื ืขื™ืœื” ืขื ื”-PID ืฉืœ ืชื”ืœื™ืš ื”ื“ืžื•ืŸ, ื•ื“ื ืฉื”ืžืฉืชืžืฉ ื ื›ื•ืŸ ื•ืฉื ื• ืืช ื”ืกืคืจื™ื™ื” ื”ื ื•ื›ื—ื™ืช ืœืกืคืจื™ื™ื” ื”ืจืืฉื™ืช:

acquire_daemonlock(0);
set_cron_uid();
set_cron_cwd();

ื ืชื™ื‘ ื‘ืจื™ืจืช ื”ืžื—ื“ืœ ืžื•ื’ื“ืจ, ืืฉืจ ื™ืฉืžืฉ ื‘ืขืช ื”ืชื—ืœืช ืชื”ืœื™ื›ื™ื:

setenv("PATH", _PATH_DEFPATH, 1);

ืœืื—ืจ ืžื›ืŸ ื”ืชื”ืœื™ืš ืขื•ื‘ืจ "ื“ืžื•ื ื™ื–ืฆื™ื”": ื”ื•ื ื™ื•ืฆืจ ืขื•ืชืง ืฆืืฆื ืฉืœ ื”ืชื”ืœื™ืš ืขืœ ื™ื“ื™ ืงืจื™ืื” ืœืคื•ืจืง ื•ื”ืคืขืœื” ื—ื“ืฉื” ื‘ืชื”ืœื™ืš ื”ื™ืœื“ (ืงืจื™ืืช 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);

ื•ืื– ืงืจื•ืŸ ืขื•ื‘ืจ ืœืžื—ื–ื•ืจ ื”ืขื‘ื•ื“ื” ื”ืจืืฉื™. ืื‘ืœ ืœืคื ื™ ื›ืŸ, ื›ื“ืื™ ืœื”ืฆื™ืฅ ื‘ื˜ืขื™ื ืช ืจืฉื™ืžืช ื”ืžืฉื™ืžื•ืช.

ืื™ืกื•ืฃ ื•ืขื“ื›ื•ืŸ ืจืฉื™ืžืช ื”ืžืฉื™ืžื•ืช

ื”ืคื•ื ืงืฆื™ื” load_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);
}

ืœืื—ืจ ืžื›ืŸ ืžืกื“ ื”ื ืชื•ื ื™ื ื”ื™ืฉืŸ ืžื•ื—ืœืฃ ื‘ื—ื“ืฉ.

ื‘ื“ื•ื’ืžืื•ืช ืฉืœืžืขืœื”, ื”ืงืจื™ืื” ืœืคื•ื ืงืฆื™ื” process_crontab ืžืืžืชืช ืฉืงื™ื™ื ืžืฉืชืžืฉ ื”ืชื•ืื ืœืฉื ืงื•ื‘ืฅ ื”ื˜ื‘ืœื” (ืืœื ืื ื”ื•ื ืžืฉืชืžืฉ-ืขืœ) ื•ืœืื—ืจ ืžื›ืŸ ืงื•ืจื ืœ-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;
    }
}

ื›ืืŸ, ืื• ืฉืžืฉืชื ื” ื”ืกื‘ื™ื‘ื” ืžื•ื’ื“ืจ (ืฉื•ืจื•ืช ื‘ืฆื•ืจืช VAR=value) ื‘ืืžืฆืขื•ืช ื”ืคื•ื ืงืฆื™ื•ืช load_env / env_set, ืื• ืฉืชื™ืื•ืจ ื”ืžืฉื™ืžื” ื ืงืจื (* * * * * /path/to/exec) ื‘ืืžืฆืขื•ืช ื”ืคื•ื ืงืฆื™ื” load_entry.

ื™ืฉื•ืช ื”ื›ื ื™ืกื” ืฉืžื—ื–ื™ืจื” load_entry ื”ื™ื ื”ืžืฉื™ืžื” ืฉืœื ื•, ืฉืžืžื•ืงืžืช ื‘ืจืฉื™ืžืช ื”ืžืฉื™ืžื•ืช ื”ื›ืœืœื™ืช. ื”ืคื•ื ืงืฆื™ื” ืขืฆืžื” ืžื‘ืฆืขืช ื ื™ืชื•ื— ืžื™ืœื•ืœื™ ืฉืœ ืคื•ืจืžื˜ ื”ื–ืžืŸ, ืืš ืื ื• ืžืขื•ื ื™ื™ื ื™ื ื™ื•ืชืจ ื‘ื™ืฆื™ืจืช ืžืฉืชื ื™ ืกื‘ื™ื‘ื” ื•ืคืจืžื˜ืจื™ื ืฉืœ ื”ืฉืงืช ืžืฉื™ืžื•ืช:

/* ะฟะพะปัŒะทะพะฒะฐั‚ะตะปัŒ ะธ ะณั€ัƒะฟะฟะฐ ะดะปั ะทะฐะฟัƒัะบะฐ ะทะฐะดะฐั‡ะธ ะฑะตั€ัƒั‚ัั ะธะท 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 Unix ืขื‘ื“ ื“ื™ ืคืฉื•ื˜: ื”ื•ื ืงืจื ืžื—ื“ืฉ ืืช ื”ืชืฆื•ืจื” ื‘ืœื•ืœืื”, ื”ืฉื™ืง ืืช ื”ืžืฉื™ืžื•ืช ืฉืœ ื”ื“ืงื” ื”ื ื•ื›ื—ื™ืช ื›ืžืฉืชืžืฉ-ืขืœ, ื•ื™ืฉืŸ ืขื“ ืชื—ื™ืœืช ื”ื“ืงื” ื”ื‘ืื”. ื’ื™ืฉื” ืคืฉื•ื˜ื” ื–ื• ื‘ืžื›ื•ื ื•ืช ื™ืฉื ื•ืช ื“ืจืฉื” ืžืฉืื‘ื™ื ืจื‘ื™ื ืžื“ื™.

ื”ื•ืฆืขื” ื’ืจืกื” ื—ืœื•ืคื™ืช ื‘-SysV, ืฉื‘ื” ื”ื“ืžื•ืŸ ื”ืœืš ืœื™ืฉื•ืŸ ืื• ืขื“ ื”ื“ืงื” ื”ืงืจื•ื‘ื” ืขื‘ื•ืจื” ื”ื•ื’ื“ืจื” ื”ืžืฉื™ืžื”, ืื• ืœืžืฉืš 30 ื“ืงื•ืช. ืคื—ื•ืช ืžืฉืื‘ื™ื ื ืฆืจื›ื• ืœืงืจื™ืื” ื—ื•ื–ืจืช ืฉืœ ื”ืชืฆื•ืจื” ื•ื‘ื“ื™ืงืช ืžืฉื™ืžื•ืช ื‘ืžืฆื‘ ื–ื”, ืืš ืขื“ื›ื•ืŸ ืžื”ื™ืจ ืฉืœ ืจืฉื™ืžืช ื”ืžืฉื™ืžื•ืช ื”ืคืš ืœื‘ืœืชื™ ื ื•ื—.

Vixie cron ื—ื–ืจื” ืœื‘ื“ื•ืง ืจืฉื™ืžื•ืช ืžืฉื™ืžื•ืช ืคืขื ื‘ื“ืงื”, ืœืžืจื‘ื” ื”ืžื–ืœ ืขื“ ืกื•ืฃ ืฉื ื•ืช ื”-80 ื”ื™ื• ื”ืจื‘ื” ื™ื•ืชืจ ืžืฉืื‘ื™ื ื‘ืžื›ื•ื ื•ืช 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 (enumerate and run tasks) ื•-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 ืžืฆื•ื™ืŸ ื‘ื˜ื‘ืœืช ื”ืžืฉื™ืžื•ืช), ื•ืœื‘ืกื•ืฃ, ืžืžืชื™ืŸ ืœ-main ืชื”ืœื™ืš ื”ืฉืœืžืช ื”ืžืฉื™ืžื”.

ืชื”ืœื™ืš ื”ืžืฉื™ืžื” ื ื•ืฆืจ ืขืœ ื™ื“ื™ ืžื–ืœื’ ื ื•ืกืฃ:

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 ื”ื•ื. ื”ืฉืžื˜ืชื™ ื›ืžื” ืคืจื˜ื™ื ืžืขื ื™ื™ื ื™ื, ืœืžืฉืœ, ื”ืชื—ืฉื‘ื ื•ืช ื‘ืžืฉืชืžืฉื™ื ืžืจื•ื—ืงื™ื, ืื‘ืœ ืฆื™ื™ื ืชื™ ืืช ื”ืขื™ืงืจ.

ืื—ืจื™ืช ื“ื‘ืจ

Cron ื”ื™ื ืชื•ื›ื ื™ืช ืคืฉื•ื˜ื” ื•ืฉื™ืžื•ืฉื™ืช ืœื”ืคืชื™ืข, ืฉื ืขืฉืชื” ื‘ืžื™ื˜ื‘ ื”ืžืกื•ืจื•ืช ืฉืœ ืขื•ืœื ื™ื•ื ื™ืงืก. ื”ื™ื ืœื ืขื•ืฉื” ืฉื•ื ื“ื‘ืจ ื ื•ืกืฃ, ืื‘ืœ ื”ื™ื ืขื•ืฉื” ืืช ื”ืขื‘ื•ื“ื” ืฉืœื” ื ืคืœื ื›ื‘ืจ ื›ืžื” ืขืฉื•ืจื™ื. ื”ืขื‘ืจืช ื”ืงื•ื“ ืœื’ืจืกื” ืฉืžื’ื™ืขื” ืขื ืื•ื‘ื•ื ื˜ื• ืืจื›ื” ืœื ื™ื•ืชืจ ืžืฉืขื”, ื•ื”ื™ื” ืœื™ ื›ื™ืฃ ื’ื“ื•ืœ! ืื ื™ ืžืงื•ื•ื” ืฉื”ืฆืœื—ืชื™ ืœื—ืœื•ืง ืืช ื–ื” ืื™ืชืš.

ืื ื™ ืœื ื™ื•ื“ืข ืžื” ืื™ืชื›ื, ืื‘ืœ ืงืฆืช ืขืฆื•ื‘ ืœื™ ืœื”ื‘ื™ืŸ ืฉืชื›ื ื•ืช ืžื•ื“ืจื ื™ื•ืช, ืขื ื”ื ื˜ื™ื™ื” ืฉืœื” ืœืกื‘ืš ื™ืชืจ ื•ืœืคืฉื˜ื•ืช ื™ืชืจ ืขืœ ื”ืžื™ื“ื”, ืœื ื”ื•ืขื™ืœื” ืœืคืฉื˜ื•ืช ื›ื–ื• ื‘ืžืฉืš ื–ืžืŸ ืจื‘.

ื™ืฉื ืŸ ืืœื˜ืจื ื˜ื™ื‘ื•ืช ืžื•ื“ืจื ื™ื•ืช ืจื‘ื•ืช ืœ-cron: ืžืขืจื›ืช ื˜ื™ื™ืžืจื™ื ืžืืคืฉืจื™ื ืœืš ืœืืจื’ืŸ ืžืขืจื›ื•ืช ืžื•ืจื›ื‘ื•ืช ืขื ืชืœื•ืช, fcron ืžืืคืฉืจืช ืœื•ื•ืกืช ื‘ืฆื•ืจื” ื’ืžื™ืฉื” ื™ื•ืชืจ ืืช ืฆืจื™ื›ืช ื”ืžืฉืื‘ื™ื ืœืคื™ ืžืฉื™ืžื•ืช. ืื‘ืœ ื‘ืื•ืคืŸ ืื™ืฉื™, ื”ืงืจื•ื ื˜ืื‘ ื”ืคืฉื•ื˜ ื‘ื™ื•ืชืจ ืชืžื™ื“ ื”ืกืคื™ืง ืœื™.

ื‘ืงื™ืฆื•ืจ, ืื”ื‘ื• ืืช ื™ื•ื ื™ืงืก, ื”ืฉืชืžืฉื• ื‘ืชื•ื›ื ื•ืช ืคืฉื•ื˜ื•ืช ื•ืืœ ืชืฉื›ื—ื• ืœืงืจื•ื ืืช ื”ืžืื ื” ืœืคืœื˜ืคื•ืจืžื” ืฉืœื›ื!

ืžืงื•ืจ: www.habr.com

ื”ื•ืกืคืช ืชื’ื•ื‘ื”