Cron เปƒเบ™ Linux: เบ›เบฐเบซเบงเบฑเบ”, เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เปเบฅเบฐเบญเบธเบ›เบฐเบเบญเบ™

Cron เปƒเบ™ Linux: เบ›เบฐเบซเบงเบฑเบ”, เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เปเบฅเบฐเบญเบธเบ›เบฐเบเบญเบ™

เบ„เบฅเบฒเบชเบชเบดเบเบ‚เบฝเบ™เบงเปˆเบฒเบŠเบปเปˆเบงเป‚เบกเบ‡เบ—เบตเปˆเบกเบตเบ„เบงเบฒเบกเบชเบธเบเบšเปเปˆเป„เบ”เป‰เป€เบšเบดเปˆเบ‡. เปƒเบ™เบŠเปˆเบงเบ‡เป€เบงเบฅเบฒเบ›เปˆเบฒเบ—เปเบฒเบกเบฐเบŠเบฒเบ”เป€เบซเบผเบปเปˆเบฒเบ™เบฑเป‰เบ™เบšเปเปˆเบกเบตเบ—เบฑเบ‡เบ™เบฑเบเบ‚เบฝเบ™เป‚เบ›เบฅเปเบเบฅเบกเบซเบผเบท Unix, เปเบ•เปˆเบ™เบฑเบเบ‚เบฝเบ™เป‚เบ›เบฅเปเบเบฅเบกเปƒเบ™เบกเบทเป‰เบ™เบตเป‰เบฎเบนเป‰เบขเปˆเบฒเบ‡เปเบ™เปˆเบ™เบญเบ™เบงเปˆเบฒ: cron เบˆเบฐเบ•เบดเบ”เบ•เบฒเบกเป€เบงเบฅเบฒเปเบ—เบ™เบžเบงเบเป€เบ‚เบปเบฒ.

เบœเบปเบ™เบ›เบฐเป‚เบซเบเบ”เบ‚เบญเบ‡เบชเบฒเบเบ„เปเบฒเบชเบฑเปˆเบ‡เปเบกเปˆเบ™เบ—เบฑเบ‡เบชเบญเบ‡เบˆเบธเบ”เบญเปˆเบญเบ™เปเบฅเบฐเบงเบฝเบเบชเปเบฒเบฅเบฑเบšเบ‚เป‰เบญเบ. sed, awk, wc, cut เปเบฅเบฐเป‚เบ„เบ‡เบเบฒเบ™เป€เบเบปเปˆเบฒเบญเบทเปˆเบ™เป†เปเบกเปˆเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เป‚เบ”เบ scripts เปƒเบ™เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเบ—เบธเบเป†เบกเบทเป‰. เบˆเปเบฒเบ™เบงเบ™เบซเบผเบฒเบเบ‚เบญเบ‡เบžเบงเบเป€เบ‚เบปเบฒเบ–เบทเบเบญเบญเบเปเบšเบšเป€เบ›เบฑเบ™เบงเบฝเบเบ‡เบฒเบ™เบชเปเบฒเบฅเบฑเบš cron, เบเปเบฒเบ™เบปเบ”เป€เบงเบฅเบฒเป€เบ”เบตเบกเบกเบฒเบˆเบฒเบ 70s.

เบชเปเบฒเบฅเบฑเบšเป€เบงเบฅเบฒเบ”เบปเบ™เบ™เบฒเบ™เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เปƒเบŠเป‰ cron superficially, เป‚เบ”เบเบšเปเปˆเบกเบตเบเบฒเบ™เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบฅเบฒเบเบฅเบฐเบญเบฝเบ”, เปเบ•เปˆเบกเบทเป‰เบซเบ™เบถเปˆเบ‡, เปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบžเบปเบšเบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเปเบฅเปˆเบ™เบชเบฐเบ„เบดเบš, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เบ•เบฑเบ”เบชเบดเบ™เปƒเบˆเป€เบšเบดเปˆเบ‡เบขเปˆเบฒเบ‡เบฅเบฐเบญเบฝเบ”. เบ™เบตเป‰เปเบกเปˆเบ™เบงเบดเบ—เบตเบเบฒเบ™เบ—เบตเปˆเบšเบปเบ”เบ„เบงเบฒเบกเบ™เบตเป‰เบ›เบฒเบเบปเบ”, เปƒเบ™เบ‚เบฐเบ™เบฐเบ—เบตเปˆเบ‚เบฝเบ™เบกเบฑเบ™เบ‚เป‰เบญเบเป„เบ”เป‰เบ„เบธเป‰เบ™เป€เบ„เบตเบเบเบฑเบš POSIX crontab, เบ•เบปเบงเป€เบฅเบทเบญเบ cron เบ•เบปเป‰เบ™เบ•เปเปƒเบ™เบเบฒเบ™เปเบˆเบเบขเบฒเบ Linux เบ—เบตเปˆเบ™เบดเบเบปเบกเปเบฅเบฐเป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบ‚เบญเบ‡เบšเบฒเบ‡เบชเปˆเบงเบ™เบ‚เบญเบ‡เบžเบงเบเป€เบ‚เบปเบฒ.

เบ—เปˆเบฒเบ™เปƒเบŠเป‰ Linux เปเบฅเบฐเป€เบฎเบฑเบ”เบงเบฝเบ cron เบšเป? เบ—เปˆเบฒเบ™เบชเบปเบ™เปƒเบˆเปƒเบ™เบชเบฐเบ–เบฒเบ›เบฑเบ”เบ•เบฐเบเบฐเบเปเบฒเบฅเบฐเบšเบปเบšเปƒเบ™ Unix เบšเป? เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™, เบžเบงเบเป€เบฎเบปเบฒเบขเบนเปˆเปƒเบ™เป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ!

เป€เบ™เบทเป‰เบญเปƒเบ™

เบ•เบปเป‰เบ™ เบเบณ เป€เบ™เบตเบ”เบ‚เบญเบ‡เบŠเบฐเบ™เบดเบ”เบžเบฑเบ™

เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เป‚เบ„เบ‡เบเบฒเบ™เบœเบนเป‰เปƒเบŠเป‰เบซเบผเบทเบฅเบฐเบšเบปเบšเป€เบ›เบฑเบ™เป„เบฅเบเบฐเป€เบงเบฅเบฒเปเบกเปˆเบ™เบกเบตเบ„เบงเบฒเบกเบˆเปเบฒเป€เบ›เบฑเบ™เบ—เบตเปˆเบŠเบฑเบ”เป€เบˆเบ™เปƒเบ™เบ—เบธเบเบฅเบฐเบšเบปเบšเบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™. เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบ™เบฑเบเบ‚เบฝเบ™เป‚เบ›เบฅเปเบเบฅเบกเป„เบ”เป‰เบฎเบฑเบšเบฎเบนเป‰เป€เบ–เบดเบ‡เบ„เบงเบฒเบกเบˆเปเบฒเป€เบ›เบฑเบ™เบ‚เบญเบ‡เบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™เบ—เบตเปˆเบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เบžเบงเบเป€เบ‚เบปเบฒเบงเบฒเบ‡เปเบœเบ™เปเบฅเบฐเบ›เบฐเบ•เบดเบšเบฑเบ”เบงเบฝเบเบ‡เบฒเบ™เบ‚เบญเบ‡เบชเบนเบ™เบเบฒเบ‡เปƒเบ™เป€เบงเบฅเบฒเบ”เบปเบ™เบ™เบฒเบ™เบเปˆเบญเบ™เบซเบ™เป‰เบฒเบ™เบตเป‰.

เบฅเบฐเบšเบปเบšเบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบ„เป‰เบฒเบเบ„เบท Unix เบ•เบดเบ”เบ•เบฒเบกเบ•เบปเป‰เบ™เบเปเบฒเป€เบ™เบตเบ”เบ‚เบญเบ‡เบžเบงเบเป€เบ‚เบปเบฒเบเบฑเบšเบ„เบทเบ™เป„เบ›เบšเปˆเบญเบ™ Version 7 Unix, เบžเบฑเบ”เบ—เบฐเบ™เบฒเปƒเบ™เบŠเบธเบกเบ›เบต 70 เบ‚เบญเบ‡เบชเบฐเบ•เบฐเบงเบฑเบ”เบ—เบตเปˆเบœเปˆเบฒเบ™เบกเบฒเบขเบนเปˆเบ—เบตเปˆ Bell Labs, เบฅเบงเบกเบ—เบฑเบ‡ Ken Thompson เบ—เบตเปˆเบกเบตเบŠเบทเปˆเบชเบฝเบ‡. เป€เบงเบตเบŠเบฑเปˆเบ™ 7 Unix เบเบฑเบ‡เบฅเบงเบกเป€เบญเบปเบฒ cron, เบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบ‚เบญเบ‡ superuser เป€เบ›เบฑเบ™เบ›เบฐเบˆเปเบฒ.

A cron เบ—เบตเปˆเบ—เบฑเบ™เบชเบฐเป„เบซเบกเบ›เบปเบเบเบฐเบ•เบดเปเบกเปˆเบ™เป‚เบ„เบ‡เบเบฒเบ™เบ—เบตเปˆเบ‡เปˆเบฒเบเบ”เบฒเบ, เปเบ•เปˆเบงเบดเบ—เบตเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบ‚เบญเบ‡เบชเบฐเบšเบฑเบšเบ•เบปเป‰เบ™เบชเบฐเบšเบฑเบšเปเบกเปˆเบ™เบ‡เปˆเบฒเบเบ”เบฒเบเบซเบผเบฒเบ: เบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™เบ•เบทเปˆเบ™เบ‚เบถเป‰เบ™เบซเบ™เบถเปˆเบ‡เบ™เบฒเบ—เบต, เบญเปˆเบฒเบ™เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบ—เบตเปˆเบกเบตเบซเบ™เป‰เบฒเบงเบฝเบเบˆเบฒเบเป„เบŸเบฅเปŒเบ”เบฝเบง (/etc/lib/crontab) เปเบฅเบฐเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบชเปเบฒเบฅเบฑเบš superuser เบงเบฝเบ เบ‡เบฒเบ™ เบ—เบตเปˆ เบ„เบงเบ™ เป„เบ”เป‰ เบฎเบฑเบš เบเบฒเบ™ เบ›เบฐ เบ•เบด เบšเบฑเบ” เปƒเบ™ เบ›เบฑเบ” เบˆเบธ เบšเบฑเบ™ .

เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™, เบชเบฐเบšเบฑเบšเบ›เบฑเบšเบ›เบธเบ‡เบ‚เบญเบ‡เบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™เบ—เบตเปˆเบ‡เปˆเบฒเบเบ”เบฒเบเปเบฅเบฐเป€เบ›เบฑเบ™เบ›เบฐเป‚เบซเบเบ”เป„เบ”เป‰เบ–เบทเบเบชเบฐเบซเบ™เบญเบ‡เปƒเบซเป‰เบเบฑเบšเบ—เบธเบเบฅเบฐเบšเบปเบšเบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบ—เบตเปˆเบ„เป‰เบฒเบเบ„เบท Unix.

เบ„เปเบฒเบญเบฐเบ—เบดเบšเบฒเบเบ—เบปเปˆเบงเป„เบ›เบ‚เบญเบ‡เบฎเบนเบšเปเบšเบš crontab เปเบฅเบฐเบซเบผเบฑเบเบเบฒเบ™เบžเบทเป‰เบ™เบ–เบฒเบ™เบ‚เบญเบ‡เบเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบ‡เบฒเบ™เบ‚เบญเบ‡เบœเบปเบ™เบ›เบฐเป‚เบซเบเบ”เป„เบ”เป‰เบ–เบทเบเบฅเบงเบกเป€เบ‚เบปเป‰เบฒเปƒเบ™เบกเบฒเบ”เบ•เบฐเบ–เบฒเบ™เบ•เบปเป‰เบ™เบ•เปเบ‚เบญเบ‡เบฅเบฐเบšเบปเบšเบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบ—เบตเปˆเบ„เป‰เบฒเบเบ„เบทเบเบฑเบš Unix - POSIX - เปƒเบ™เบ›เบต 1992, เปเบฅเบฐเบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™ cron เบˆเบฒเบเบกเบฒเบ”เบ•เบฐเบ–เบฒเบ™ de facto เป„เบ”เป‰เบเบฒเบเป€เบ›เบฑเบ™เบกเบฒเบ”เบ•เบฐเบ–เบฒเบ™ de jure.

เปƒเบ™เบ›เบต 1987, Paul Vixie, เป„เบ”เป‰เบชเปเบฒเบซเบผเบงเบ”เบœเบนเป‰เปƒเบŠเป‰ Unix เบเปˆเบฝเบงเบเบฑเบšเบ„เบงเบฒเบกเบ›เบฒเบ”เบ–เบฐเบซเบ™เบฒเบ‚เบญเบ‡เป€เบ‚เบปเบฒเป€เบˆเบปเป‰เบฒเบชเปเบฒเบฅเบฑเบš cron, เป„เบ”เป‰เบญเบญเบเบชเบฐเบšเบฑเบšเบญเบทเปˆเบ™เบ‚เบญเบ‡ daemon เบ—เบตเปˆเปเบเป‰เป„เบ‚เบšเบฒเบ‡เบšเบฑเบ™เบซเบฒเบ‚เบญเบ‡ cron เปเบšเบšเบ”เบฑเป‰เบ‡เป€เบ”เบตเบกเปเบฅเบฐเบ‚เบฐเบซเบเบฒเบ syntax เบ‚เบญเบ‡เป„เบŸเบฅเปŒเบ•เบฒเบ•เบฐเบฅเบฒเบ‡.

เป‚เบ”เบเบชเบฐเบšเบฑเบšเบ—เบตเบชเบฒเบกเบ‚เบญเบ‡ Vixie cron เป„เบ”เป‰เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบ—เบตเปˆเบˆเบฐเบ•เบญเบšเบชเบฐเบซเบ™เบญเบ‡เบ„เบงเบฒเบกเบ•เป‰เบญเบ‡เบเบฒเบ™ POSIX, เบ™เบญเบเบˆเบฒเบเบ™เบฑเป‰เบ™, เป‚เบ„เบ‡เบเบฒเบ™เบ”เบฑเปˆเบ‡เบเปˆเบฒเบงเบกเบตเปƒเบšเบญเบฐเบ™เบธเบเบฒเบ”เปเบšเบšเป€เบชเบฅเบต, เบซเบผเบทเปเบ—เบ™เบ—เบตเปˆเบˆเบฐเบšเปเปˆเบกเบตเปƒเบšเบญเบฐเบ™เบธเบเบฒเบ”เปƒเบ”เป†, เบเบปเบเป€เบงเบฑเป‰เบ™เบ„เบงเบฒเบกเบ›เบฒเบ”เบ–เบฐเบซเบ™เบฒเปƒเบ™ README: เบœเบนเป‰เบ‚เบฝเบ™เบšเปเปˆเป„เบ”เป‰เปƒเบซเป‰เบเบฒเบ™เบ„เปเป‰เบฒเบ›เบฐเบเบฑเบ™, เบŠเบทเปˆเบœเบนเป‰เบ‚เบฝเบ™. เบšเปเปˆโ€‹เบชเบฒโ€‹เบกเบฒเบ”โ€‹เบ–เบทเบโ€‹เบฅเบปเบšโ€‹, เปเบฅเบฐโ€‹เป‚เบ„เบ‡โ€‹เบเบฒเบ™โ€‹เบžเบฝเบ‡โ€‹เปเบ•เปˆโ€‹เบชเบฒโ€‹เบกเบฒเบ”โ€‹เป„เบ”เป‰โ€‹เบฎเบฑเบšโ€‹เบเบฒเบ™โ€‹เบ‚เบฒเบโ€‹เบฎเปˆเบงเบกโ€‹เบเบฑเบ™โ€‹เบเบฑเบšโ€‹เบฅเบฐโ€‹เบซเบฑเบ”โ€‹เปเบซเบผเปˆเบ‡โ€‹. เบ‚เปเป‰เบเปเบฒเบ™เบปเบ”เป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เป„เบ”เป‰เบเบฒเบเป€เบ›เบฑเบ™เบ—เบตเปˆเป€เบซเบกเบฒเบฐเบชเบปเบกเบเบฑเบšเบซเบผเบฑเบเบเบฒเบ™เบ‚เบญเบ‡เบŠเบญเบšเปเบงเบŸเบฃเบตเบ—เบตเปˆเบเปเบฒเบฅเบฑเบ‡เป„เบ”เป‰เบฎเบฑเบšเบ„เบงเบฒเบกเบ™เบดเบเบปเบกเปƒเบ™เบŠเบธเบกเบ›เบตเบ™เบฑเป‰เบ™, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบšเบฒเบ‡เบเบฒเบ™เปเบˆเบเบขเบฒเบ Linux เบ—เบตเปˆเบชเปเบฒเบ„เบฑเบ™เบ—เบตเปˆเบ›เบฒเบเบปเบ”เปƒเบ™เบ•เบปเป‰เบ™ 90s เป„เบ”เป‰เป€เบญเบปเบฒ Vixie cron เป€เบ›เบฑเบ™เบฅเบฐเบšเบปเบšเบ‚เบญเบ‡เบžเบงเบเป€เบ‚เบปเบฒเปเบฅเบฐเบเบฑเบ‡เบžเบฑเบ”เบ—เบฐเบ™เบฒเบกเบฑเบ™เปƒเบ™เบกเบทเป‰เบ™เบตเป‰.

เป‚เบ”เบเบชเบฐเป€เบžเบฒเบฐ, Red Hat เปเบฅเบฐ SUSE เบžเบฑเบ”เบ—เบฐเบ™เบฒเบชเป‰เบญเบกเบ‚เบญเบ‡ Vixie cron - cronie, เปเบฅเบฐ Debian เปเบฅเบฐ Ubuntu เปƒเบŠเป‰เบชเบฐเบšเบฑเบšเบ•เบปเป‰เบ™เบชเบฐเบšเบฑเบšเบ‚เบญเบ‡ Vixie cron เบ—เบตเปˆเบกเบตเบซเบผเบฒเบเปเบœเปˆเบ™.

เบ—เปเบฒเบญเบดเบ”เปƒเบซเป‰เบžเบงเบเป€เบฎเบปเบฒเบฎเบนเป‰เบˆเบฑเบเบเบฑเบš utility crontab เบ‚เบญเบ‡เบœเบนเป‰เปƒเบŠเป‰เบ—เบตเปˆเบญเบฐเบ—เบดเบšเบฒเบเป„เบงเป‰เปƒเบ™ POSIX, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเป€เบšเบดเปˆเบ‡เบเบฒเบ™เบ‚เบฐเบซเบเบฒเบ syntax เบ—เบตเปˆเบชเบฐเบซเบ™เบญเบ‡เปƒเบซเป‰เบขเบนเปˆเปƒเบ™ Vixie cron เปเบฅเบฐเบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เบ‚เบญเบ‡ Vixie cron เปƒเบ™เบเบฒเบ™เปเบˆเบเบขเบฒเบ Linux เบ—เบตเปˆเบ™เบดเบเบปเบก. เปเบฅเบฐเบชเบธเบ”เบ—เป‰เบฒเบ, cherry เปƒเบ™ cake เปเบกเปˆเบ™เบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเบ‚เบญเบ‡เบญเบธเบ›เบฐเบเบญเบ™ cron daemon.

POSIX crontab

เบ–เป‰เบฒ cron เบ•เบปเป‰เบ™เบชเบฐเบšเบฑเบšเป€เบฎเบฑเบ”เบงเบฝเบเบชเบฐเป€เบซเบกเบตเบชเปเบฒเบฅเบฑเบš superuser, เบœเบนเป‰เบเปเบฒเบ™เบปเบ”เป€เบงเบฅเบฒเบ—เบตเปˆเบ—เบฑเบ™เบชเบฐเป„เบซเบกเบกเบฑเบเบˆเบฐเบˆเบฑเบ”เบเบฒเบ™เบเบฑเบšเบงเบฝเบเบ‡เบฒเบ™เบ‚เบญเบ‡เบœเบนเป‰เปƒเบŠเป‰เบ—เบปเปˆเบงเป„เบ›, เป€เบŠเบดเปˆเบ‡เบกเบตเบ„เบงเบฒเบกเบ›เบญเบ”เป„เบžเปเบฅเบฐเบชเบฐเบ”เบงเบเบเบงเปˆเบฒ.

Crons เป„เบ”เป‰เบ–เบทเบเบชเบฐเบซเบ™เบญเบ‡เปƒเบซเป‰เป€เบ›เบฑเบ™เบŠเบธเบ”เบ‚เบญเบ‡เบชเบญเบ‡เป‚เบ„เบ‡เบเบฒเบ™: cron daemon เบ—เบตเปˆเป€เบฎเบฑเบ”เบงเบฝเบเบขเปˆเบฒเบ‡เบ•เปเปˆเป€เบ™เบทเปˆเบญเบ‡เปเบฅเบฐเบœเบปเบ™เบ›เบฐเป‚เบซเบเบ” crontab เบ—เบตเปˆเบกเบตเปƒเบซเป‰เบเบฑเบšเบœเบนเป‰เปƒเบŠเป‰. เบญเบฑเบ™เบชเบธเบ”เบ—เป‰เบฒเบเบŠเปˆเบงเบเปƒเบซเป‰เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เปเบเป‰เป„เบ‚เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบงเบฝเบเบชเบฐเป€เบžเบฒเบฐเบเบฑเบšเบœเบนเป‰เปƒเบŠเป‰เปเบ•เปˆเบฅเบฐเบ„เบปเบ™เปƒเบ™เบฅเบฐเบšเบปเบš, เปƒเบ™เบ‚เบฐเบ™เบฐเบ—เบตเปˆ daemon เป€เบ›เบตเบ”เบซเบ™เป‰เบฒเบงเบฝเบเบˆเบฒเบเบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบœเบนเป‰เปƒเบŠเป‰เปเบฅเบฐเบฅเบฐเบšเบปเบš.

ะ’ เบกเบฒเบ”เบ•เบฐเบ–เบฒเบ™ POSIX เบžเบถเบ”เบ•เบดเบเปเบฒเบ‚เบญเบ‡ daemon เบšเปเปˆเป„เบ”เป‰เบ–เบทเบเบญเบฐเบ—เบดเบšเบฒเบเปƒเบ™เบ—เบฒเบ‡เปƒเบ”เบเปเปˆเบ•เบฒเบกเปเบฅเบฐเบžเบฝเบ‡เปเบ•เปˆเป‚เบ„เบ‡เบเบฒเบ™เบœเบนเป‰เปƒเบŠเป‰เป€เบ—เบปเปˆเบฒเบ™เบฑเป‰เบ™เบ—เบตเปˆเป€เบ›เบฑเบ™เบ—เบฒเบ‡เบเบฒเบ™ crontab. เบเบฒเบ™เบกเบตเบขเบนเปˆเบ‚เบญเบ‡เบเบปเบ™เป„เบเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบ›เบตเบ”เบ•เบปเบงเบงเบฝเบเบ‡เบฒเบ™เบ‚เบญเบ‡เบœเบนเป‰เปƒเบŠเป‰เปเบกเปˆเบ™, เปเบ™เปˆเบ™เบญเบ™, implied, เปเบ•เปˆเบšเปเปˆเป„เบ”เป‰เบญเบฐเบ—เบดเบšเบฒเบเบฅเบฒเบเบฅเบฐเบญเบฝเบ”.

เป‚เบ”เบเบเบฒเบ™เป‚เบ—เบซเบฒ crontab utility, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป€เบฎเบฑเบ”เบชเบตเปˆเบขเปˆเบฒเบ‡: เปเบเป‰เป„เบ‚เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบงเบฝเบเบ‚เบญเบ‡เบœเบนเป‰เปƒเบŠเป‰เปƒเบ™เบšเบฑเบ™เบ™เบฒเบ—เบดเบเบฒเบ™, เป‚เบซเบฅเบ”เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบˆเบฒเบเป„เบŸเบฅเปŒ, เบชเบฐเปเบ”เบ‡เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบงเบฝเบเบ‡เบฒเบ™เปƒเบ™เบ›เบฐเบˆเบธเบšเบฑเบ™, เปเบฅเบฐเบฅเบถเบšเบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบงเบฝเบ. เบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡เบงเบดเบ—เบตเบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบ‚เบญเบ‡ 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

เบšเบฑเบ™เบžเบฐเบšเบธเบฅเบธเบ”เบ—เบปเปˆเบงเป„เบ›เบ‚เบญเบ‡เบ•เบปเบงเปเบ› cron เบ—เบตเปˆเบ™เบดเบเบปเบกเปเบกเปˆเบ™ Vixie cron 3.0pl1, เบ™เปเบฒเบชเบฐเป€เบซเบ™เบตเปƒเบ™เบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆเบ—เบฒเบ‡เป„เบ›เบชเบฐเบ™เบต comp.sources.unix เปƒเบ™เบ›เบต 1992. เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบžเบดเบˆเบฒเบฅเบฐเบ™เบฒเบฅเบฑเบเบชเบฐเบ™เบฐเบ•เบปเป‰เบ™เบ•เปเบ‚เบญเบ‡เบชเบฐเบšเบฑเบšเบ™เบตเป‰เปƒเบ™เบฅเบฒเบเบฅเบฐเบญเบฝเบ”เป€เบžเบตเปˆเบกเป€เบ•เบตเบก.

Vixie cron เบกเบฒเปƒเบ™เบชเบญเบ‡เป‚เบ„เบ‡เบเบฒเบ™ (cron เปเบฅเบฐ crontab). เบ•เบฒเบกเบ›เบปเบเบเบฐเบ•เบด, daemon เปเบกเปˆเบ™เบฎเบฑเบšเบœเบดเบ”เบŠเบญเบšเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบญเปˆเบฒเบ™เปเบฅเบฐเปเบฅเปˆเบ™เบงเบฝเบเบ‡เบฒเบ™เบˆเบฒเบเบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบงเบฝเบเบ‡เบฒเบ™เบ‚เบญเบ‡เบฅเบฐเบšเบปเบšเปเบฅเบฐเบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบงเบฝเบเบ‡เบฒเบ™เบ‚เบญเบ‡เบœเบนเป‰เปƒเบŠเป‰เบชเปˆเบงเบ™เบšเบธเบเบ„เบปเบ™, เปเบฅเบฐเบœเบปเบ™เบ›เบฐเป‚เบซเบเบ” crontab เปเบกเปˆเบ™เบฎเบฑเบšเบœเบดเบ”เบŠเบญเบšเปƒเบ™เบเบฒเบ™เปเบเป‰เป„เบ‚เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบœเบนเป‰เปƒเบŠเป‰.

เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบงเบฝเบเปเบฅเบฐเป„เบŸเบฅเปŒเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ

เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบงเบฝเบเบ‡เบฒเบ™ superuser เปเบกเปˆเบ™เบขเบนเปˆเปƒเบ™ /etc/crontab. syntax เบ‚เบญเบ‡เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบฅเบฐเบšเบปเบšเบเบปเบ‡เบเบฑเบ™เบเบฑเบš syntax เบ‚เบญเบ‡ Vixie cron, เบเบปเบเป€เบงเบฑเป‰เบ™เบงเปˆเบฒเบ„เปเบฅเปเบฒเบ—เบต VI เปƒเบ™เบกเบฑเบ™เบŠเบตเป‰เปƒเบซเป‰เป€เบซเบฑเบ™เบŠเบทเปˆเบ‚เบญเบ‡เบœเบนเป‰เปƒเบŠเป‰เบžเบฒเบเปƒเบ•เป‰เบเบฒเบ™เป€เบ›เบตเบ”เบ•เบปเบงเบ‚เบญเบ‡เบงเบฝเบเบ‡เบฒเบ™เบ”เบฑเปˆเบ‡เบเปˆเบฒเบง:

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

เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบงเบฝเบเบ‡เบฒเบ™เบ‚เบญเบ‡เบœเบนเป‰เปƒเบŠเป‰เบ›เบปเบเบเบฐเบ•เบดเปเบกเปˆเบ™เบขเบนเปˆเปƒเบ™ /var/cron/tabs/username เปเบฅเบฐเปƒเบŠเป‰ syntax เบ”เบฝเบงเบเบฑเบ™. เป€เบกเบทเปˆเบญเบ—เปˆเบฒเบ™เป€เบญเบตเป‰เบ™เปƒเบŠเป‰ crontab utility เป€เบ›เบฑเบ™เบœเบนเป‰เปƒเบŠเป‰, เป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เปเบกเปˆเบ™เป„เบŸเบฅเปŒเบ—เบตเปˆเบ–เบทเบเบ”เบฑเบ”เปเบเป‰.

เบฅเบฒเบเบŠเบทเปˆเบœเบนเป‰เปƒเบŠเป‰เบ—เบตเปˆเบกเบตเบเบฒเบ™เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡ crontab เปเบกเปˆเบ™เบ–เบทเบเบˆเบฑเบ”เบเบฒเบ™เบขเบนเปˆเปƒเบ™เป„เบŸเบฅเปŒ /var/cron/allow เปเบฅเบฐ /var/cron/deny, เบšเปˆเบญเบ™เบ—เบตเปˆเบ—เปˆเบฒเบ™เบžเบฝเบ‡เปเบ•เปˆเบ•เป‰เบญเบ‡เบเบฒเบ™เปƒเบชเปˆเบŠเบทเปˆเบœเบนเป‰เปƒเบŠเป‰เปƒเบ™เปเบ–เบงเปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบ.

syntax เบ‚เบฐเบซเบเบฒเบ

เป€เบกเบทเปˆเบญเบ›เบฝเบšเบ—เบฝเบšเบเบฑเบš POSIX crontab, เบเบฒเบ™เปเบเป‰เป„เบ‚เบ‚เบญเบ‡ Paul Vixey เบ›เบฐเบเบญเบšเบ”เป‰เบงเบเบเบฒเบ™เบ”เบฑเบ”เปเบ›เบ‡เบ—เบตเปˆเป€เบ›เบฑเบ™เบ›เบฐเป‚เบซเบเบ”เบซเบผเบฒเบเบ•เปเปˆ syntax เบ‚เบญเบ‡เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบงเบฝเบเบ‡เบฒเบ™เบ‚เบญเบ‡เบœเบปเบ™เบ›เบฐเป‚เบซเบเบ”.

syntax เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เปƒเบซเบกเปˆเป„เบ”เป‰เบเบฒเบเป€เบ›เบฑเบ™เบ—เบตเปˆเบกเบตเบขเบนเปˆ: เบ•เบปเบงเบขเปˆเบฒเบ‡, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบเปเบฒเบ™เบปเบ”เบกเบทเป‰เบ‚เบญเบ‡เบญเบฒเบ—เบดเบ”เบซเบผเบทเป€เบ”เบทเบญเบ™เป‚เบ”เบเบŠเบทเปˆ (เบˆเบฑเบ™, เบญเบฑเบ‡เบ„เบฒเบ™, เปเบฅเบฐเบญเบทเปˆเบ™เป†):

# ะ—ะฐะฟัƒัะบะฐะตั‚ัั ะตะถะตะผะธะฝัƒั‚ะฝะพ ะฟะพ ะฟะพะฝะตะดะตะปัŒะฝะธะบะฐะผ ะธ ะฒั‚ะพั€ะฝะธะบะฐะผ ะฒ ัะฝะฒะฐั€ะต
* * * Jan Mon,Tue /path/to/exec

เบ—เปˆเบฒเบ™โ€‹เบชเบฒโ€‹เบกเบฒเบ”โ€‹เบฅเบฐโ€‹เบšเบธโ€‹เบ‚เบฑเป‰เบ™โ€‹เบ•เบญเบ™โ€‹เบ—เบตเปˆโ€‹เบงเบฝเบโ€‹เบ‡เบฒเบ™โ€‹เบ—เบตเปˆโ€‹เป„เบ”เป‰โ€‹เบฎเบฑเบšโ€‹เบเบฒเบ™โ€‹เป€เบ›เบตเบ”โ€‹:

# ะ—ะฐะฟัƒัะบะฐะตั‚ัั ั ัˆะฐะณะพะผ ะฒ ะดะฒะต ะผะธะฝัƒั‚ั‹
*/2 * * * Mon,Tue /path/to/exec

เบ‚เบฑเป‰เบ™เบ•เบญเบ™ เปเบฅเบฐเป„เบฅเบเบฐเบซเปˆเบฒเบ‡เบชเบฒเบกเบฒเบ”เบ›เบฐเบชเบปเบกเบเบฑเบ™เป„เบ”เป‰:

# ะ—ะฐะฟัƒัะบะฐะตั‚ัั ั ัˆะฐะณะพะผ ะฒ ะดะฒะต ะผะธะฝัƒั‚ั‹ ะฒ ะฟะตั€ะฒั‹ั… ะดะตััั‚ัŒ ะผะธะฝัƒั‚ ะบะฐะถะดะพะณะพ ั‡ะฐัะฐ
0-10/2 * * * * /path/to/exec

เบ—เบฒเบ‡เป€เบฅเบทเบญเบเบ—เบตเปˆเป€เบ‚เบปเป‰เบฒเปƒเบˆเป„เบ”เป‰เบเบฑเบš syntax เบ›เบปเบเบเบฐเบ•เบดเปเบกเปˆเบ™เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™ (reboot, เบ›เบต, เบ›เบต, เป€เบ”เบทเบญเบ™, เบญเบฒเบ—เบดเบ”, เบ›เบฐเบˆเปเบฒเบงเบฑเบ™, เป€เบงเบฅเบฒเบ—เปˆเบฝเบ‡เบ„เบทเบ™, เบŠเบปเปˆเบงเป‚เบกเบ‡):

# ะ—ะฐะฟัƒัะบะฐะตั‚ัั ะฟะพัะปะต ะฟะตั€ะตะทะฐะณั€ัƒะทะบะธ ัะธัั‚ะตะผั‹
@reboot /exec/on/reboot
# ะ—ะฐะฟัƒัะบะฐะตั‚ัั ั€ะฐะท ะฒ ะดะตะฝัŒ
@daily /exec/daily
# ะ—ะฐะฟัƒัะบะฐะตั‚ัั ั€ะฐะท ะฒ ั‡ะฐั
@hourly /exec/daily

เบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบกเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบงเบฝเบเบ‡เบฒเบ™

Vixie cron เบŠเปˆเบงเบเปƒเบซเป‰เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ›เปˆเบฝเบ™เบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบกเบ‚เบญเบ‡เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เบ—เบตเปˆเปƒเบŠเป‰เป„เบ”เป‰.

เบ•เบปเบงเปเบ›เบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบก USER, LOGNAME เปเบฅเบฐ HOME เบšเปเปˆเบžเบฝเบ‡เปเบ•เปˆเบชเบฐเบซเบ™เบญเบ‡เปƒเบซเป‰เป‚เบ”เบ daemon, เปเบ•เปˆเบ–เบทเบเป€เบญเบปเบฒเบกเบฒเบˆเบฒเบเป„เบŸเบฅเปŒ. passwd. เบ•เบปเบงเปเบ› 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 เปเบกเปˆเบ™เบญเบฒเบ”เบˆเบฐเป€เบ›เบฑเบ™เบกเบฐเบซเบฒเบงเบดเบ—เบฐเบเบฒเป„เบฅเบ„เบฒเบฅเบดเบŸเปเป€เบ™เบ, Berkeley).

cron เปƒเบ™ Debian เปเบฅเบฐ Ubuntu

เบ™เบฑเบเบžเบฑเบ”เบ—เบฐเบ™เบฒ Debian เปเบฅเบฐเบเบฒเบ™เปเบœเปˆเบเบฐเบˆเบฒเบเบญเบฐเบ™เบธเบžเบฑเบ™เป„เบ”เป‰เบ›เปˆเบญเบเบญเบญเบเบกเบฒ เบชเบฐโ€‹เบšเบฑเบšโ€‹เบ›เบฑเบšโ€‹เบ›เบธเบ‡โ€‹เบชเบนเบ‡โ€‹ Vixie cron เบฎเบธเปˆเบ™ 3.0pl1. เบšเปเปˆเบกเบตเบ„เบงเบฒเบกเปเบ•เบเบ•เปˆเบฒเบ‡เปƒเบ™ syntax เบ‚เบญเบ‡เป„เบŸเบฅเปŒเบ•เบฒเบ•เบฐเบฅเบฒเบ‡; เบชเปเบฒเบฅเบฑเบšเบœเบนเป‰เปƒเบŠเป‰เบกเบฑเบ™เปเบกเปˆเบ™ Vixie cron เบ”เบฝเบงเบเบฑเบ™. เบ„เบธเบ™เบ™เบฐเบชเบปเบกเบšเบฑเบ”เปƒเบซเบกเปˆเบ—เบตเปˆเปƒเบซเบเปˆเบ—เบตเปˆเบชเบธเบ”: เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™ syslog, SELinux ะธ PAM.

เบชเบฑเบ‡เป€เบเบ”เป€เบซเบฑเบ™เบซเบ™เป‰เบญเบ, เปเบ•เปˆเบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เบ—เบตเปˆเป€เบซเบฑเบ™เป„เบ”เป‰เบŠเบฑเบ”เป€เบˆเบ™เบ›เบฐเบเบญเบšเบกเบตเบชเบฐเบ–เบฒเบ™เบ—เบตเปˆเบ‚เบญเบ‡เป„เบŸเบฅเปŒเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเปเบฅเบฐเบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบงเบฝเบ.

เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบœเบนเป‰เปƒเบŠเป‰เปƒเบ™ Debian เปเบกเปˆเบ™เบขเบนเปˆเปƒเบ™เป„เบ”เป€เบฅเบเบฐเบ—เปเบฅเบต /var/spool/cron/crontabs, เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบฅเบฐเบšเบปเบšเปเบกเปˆเบ™เบเบฑเบ‡เบกเบตเบขเบนเปˆ - เปƒเบ™ /etc/crontab. เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบงเบฝเบเบชเบฐเป€เบžเบฒเบฐเบ‚เบญเบ‡เปเบžเบฑเบเป€เบเบฑเบ” Debian เปเบกเปˆเบ™เบ–เบทเบเบˆเบฑเบ”เปƒเบชเปˆเปƒเบ™ /etc/cron.d, เบˆเบฒเบเบšเปˆเบญเบ™เบ—เบตเปˆ cron daemon เบญเปˆเบฒเบ™เบžเบงเบเบกเบฑเบ™เป‚เบ”เบเบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”. เบเบฒเบ™เบ„เบงเบšเบ„เบธเบกเบเบฒเบ™เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เบœเบนเป‰เปƒเบŠเป‰เบ–เบทเบเบ„เบงเบšเบ„เบธเบกเป‚เบ”เบเป„เบŸเบฅเปŒ /etc/cron.allow เปเบฅเบฐ /etc/cron.deny.

เป€เบŠเบฅเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เปเบกเปˆเบ™เบเบฑเบ‡ /bin/sh, เป€เบŠเบดเปˆเบ‡เปƒเบ™ Debian เปเบกเปˆเบ™เปเบเบฐเบ—เบตเปˆเบ›เบฐเบ•เบดเบšเบฑเบ”เบ•เบฒเบก POSIX เบ‚เบฐเบซเบ™เบฒเบ”เบ™เป‰เบญเบ. dash, เป€เบ›เบตเบ”เบ•เบปเบงเป‚เบ”เบเบšเปเปˆเบกเบตเบเบฒเบ™เบญเปˆเบฒเบ™เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเปƒเบ”เป† (เปƒเบ™เป‚เบซเบกเบ”เบ—เบตเปˆเบšเปเปˆเบกเบตเบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบš).

Cron เบ•เบปเบงเบ‚เบญเบ‡เบกเบฑเบ™เป€เบญเบ‡เปƒเบ™เบชเบฐเบšเบฑเบšเบซเบฅเป‰เบฒเบชเบธเบ”เบ‚เบญเบ‡ Debian เปเบกเปˆเบ™เป€เบ›เบตเบ”เบ•เบปเบงเบœเปˆเบฒเบ™ systemd, เปเบฅเบฐเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบเบฒเบ™เป€เบ›เบตเบ”เบ•เบปเบงเบชเบฒเบกเบฒเบ”เป€เบšเบดเปˆเบ‡เป„เบ”เป‰เปƒเบ™ /lib/systemd/system/cron.service. เบšเปเปˆเบกเบตเบซเบเบฑเบ‡เบžเบดเป€เบชเบ”เปƒเบ™เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™; เบเบฒเบ™เบˆเบฑเบ”เบเบฒเบ™เบงเบฝเบเบ—เบตเปˆเบฅเบฐเบญเบฝเบ”เบญเปˆเบญเบ™เบเบงเปˆเบฒเบชเบฒเบกเบฒเบ”เป€เบฎเบฑเบ”เป„เบ”เป‰เป‚เบ”เบเบœเปˆเบฒเบ™เบ•เบปเบงเปเบ›เบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบกเบ—เบตเปˆเบ›เบฐเบเบฒเบ”เป‚เบ”เบเบเบปเบ‡เปƒเบ™ crontab เบ‚เบญเบ‡เบœเบนเป‰เปƒเบŠเป‰เปเบ•เปˆเบฅเบฐเบ„เบปเบ™.

cronie เปƒเบ™ RedHat, Fedora เปเบฅเบฐ CentOS

เป€เบชเบ”เบ–เบต - เบชเป‰เบญเบกเบ‚เบญเบ‡ Vixie cron เบฅเบธเป‰เบ™ 4.1. เป€เบŠเบฑเปˆเบ™เบ”เบฝเบงเบเบฑเบ™เบเบฑเบšเปƒเบ™ Debian, syntax เบšเปเปˆเป„เบ”เป‰เบ›เปˆเบฝเบ™เปเบ›เบ‡, เปเบ•เปˆเบเบฒเบ™เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™ PAM เปเบฅเบฐ SELinux, เป€เบฎเบฑเบ”เบงเบฝเบเบขเบนเปˆเปƒเบ™เบเบธเปˆเบก, เบเบฒเบ™เบ•เบดเบ”เบ•เบฒเบกเป„เบŸเบฅเปŒเป‚เบ”เบเปƒเบŠเป‰ inotify เปเบฅเบฐเบฅเบฑเบเบชเบฐเบ™เบฐเบญเบทเปˆเบ™เป†เป„เบ”เป‰เบ–เบทเบเป€เบžเบตเปˆเบก.

เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เปเบกเปˆเบ™เบขเบนเปˆเปƒเบ™เบชเบฐเบ–เบฒเบ™เบ—เบตเปˆเบ›เบปเบเบเบฐเบ•เบด: เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบฅเบฐเบšเบปเบšเบขเบนเปˆเปƒเบ™ /etc/crontab, packages เบงเบฒเบ‡เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบ‚เบญเบ‡เบžเบงเบเป€เบ‚เบปเบฒเปƒเบ™ /etc/cron.d, เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบœเบนเป‰เปƒเบŠเป‰เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™ /var/spool/cron/crontabs.

daemon เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบžเบฒเบเปƒเบ•เป‰เบเบฒเบ™เบ„เบงเบšเบ„เบธเบกเบฅเบฐเบšเบปเบš, เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™เปเบกเปˆเบ™ /lib/systemd/system/crond.service.

เบเปˆเบฝเบงเบเบฑเบšเบเบฒเบ™เปเบˆเบเบขเบฒเบเบ—เบตเปˆเบ„เป‰เบฒเบเบ„เบทเบเบฑเบš Red Hat, /bin/sh เบ–เบทเบเปƒเบŠเป‰เป‚เบ”เบเบ„เปˆเบฒเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เปƒเบ™เบ•เบญเบ™เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™, เป€เบŠเบดเปˆเบ‡เป€เบ›เบฑเบ™ bash เบกเบฒเบ”เบ•เบฐเบ–เบฒเบ™. เบกเบฑเบ™เบ„เบงเบ™เบˆเบฐเบชเบฑเบ‡เป€เบเบ”เบงเปˆเบฒเป€เบกเบทเปˆเบญเปเบฅเปˆเบ™เบงเบฝเบ cron เบœเปˆเบฒเบ™ /bin/sh, bash shell เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เปƒเบ™เป‚เบซเบกเบ” POSIX-compliant เปเบฅเบฐเบšเปเปˆเป„เบ”เป‰เบญเปˆเบฒเบ™เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเป€เบžเบตเปˆเบกเป€เบ•เบตเบก, เปเบฅเปˆเบ™เบขเบนเปˆเปƒเบ™เป‚เบซเบกเบ”เบ—เบตเปˆเบšเปเปˆเบกเบตเบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบš.

cronie เปƒเบ™ SLES เปเบฅเบฐ openSUSE

เบเบฒเบ™เปเบˆเบเบขเบฒเบเป€เบเบเบฅเบฐเบกเบฑเบ™ SLES เปเบฅเบฐเบญเบฐเบ™เบธเบžเบฑเบ™ openSUSE เบ‚เบญเบ‡เบกเบฑเบ™เปƒเบŠเป‰ cronie เบ”เบฝเบงเบเบฑเบ™. daemon เบขเบนเปˆเบ—เบตเปˆเบ™เบตเป‰เบเบฑเบ‡เบ–เบทเบเป€เบ›เบตเบ”เบ•เบปเบงเบžเบฒเบเปƒเบ•เป‰ 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 เบ•เบปเป‰เบ™เบชเบฐเบšเบฑเบšเป‚เบ”เบ Paul Vixey เปเบกเปˆเบ™เบกเบตเบ„เบงเบฒเบกเบเบดเบ™เบ”เบตเบ—เบตเปˆเบˆเบฐเบญเปˆเบฒเบ™.

เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เบ•เบฑเบ”เบชเบดเบ™เปƒเบˆเบงเบดเป€เบ„เบฒเบฐเบญเบธเบ›เบฐเบเบญเบ™ cron เป‚เบ”เบเปƒเบŠเป‰เบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡เป‚เบ„เบ‡เบเบฒเบ™ cron เบ—เบปเปˆเบงเป„เบ›เบเบฑเบšเบ—เบฑเบ‡เบชเบญเบ‡เบชเบฒเบ‚เบฒเบ‚เบญเบ‡เบเบฒเบ™เบžเบฑเบ”เบ—เบฐเบ™เบฒ - Vixie cron 3.0pl1. เบ‚เป‰เบญเบเบˆเบฐเป€เบฎเบฑเบ”เบ•เบปเบงเบขเปˆเบฒเบ‡เบ‡เปˆเบฒเบเป‚เบ”เบเบเบฒเบ™เบ–เบญเบ™ ifdefs เบ—เบตเปˆเบชเบฑเบšเบชเบปเบ™เบเบฒเบ™เบญเปˆเบฒเบ™เปเบฅเบฐเบฅเบปเบšเบฅเป‰เบฒเบ‡เบฅเบฒเบเบฅเบฐเบญเบฝเบ”เป€เบฅเบฑเบเบ™เป‰เบญเบ.

เบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบ‚เบญเบ‡เบœเบตเบ›เบตเบชเบฒเบ”เบชเบฒเบกเบฒเบ”เปเบšเปˆเบ‡เบญเบญเบเป€เบ›เบฑเบ™เบซเบผเบฒเบเบ‚เบฑเป‰เบ™เบ•เบญเบ™:

  1. เบเบฒเบ™เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เป‚เบ„เบ‡เบเบฒเบ™.
  2. เป€เบเบฑเบšเบเปเบฒเปเบฅเบฐเบ›เบฑเบšเบ›เบธเบ‡เบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆเบ‚เบญเบ‡เบซเบ™เป‰เบฒเบงเบฝเบเบ—เบตเปˆเบˆเบฐเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™.
  3. เปเบฅเปˆเบ™ cron loop เบซเบผเบฑเบ.
  4. เป€เบฅเบตเปˆเบกเปœเป‰เบฒเบงเบฝเบ.

เปƒเบซเป‰เป€เบšเบดเปˆเบ‡เบขเบนเปˆเปƒเบ™เบ„เปเบฒเบชเบฑเปˆเบ‡.

เบเบฒเบ™เบฅเบดเป€เบฅเบตเปˆเบก

เป€เบกเบทเปˆเบญเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™, เบซเบผเบฑเบ‡เบˆเบฒเบเบเบฒเบ™เบเบงเบ”เบชเบญเบšเบเบฒเบ™เป‚เบ•เป‰เบ–เบฝเบ‡เบ‚เบฐเบšเบงเบ™เบเบฒเบ™, cron เบ•เบดเบ”เบ•เบฑเป‰เบ‡เบ•เบปเบงเบˆเบฑเบ”เบเบฒเบ™เบชเบฑเบ™เบเบฒเบ™ SIGCHLD เปเบฅเบฐ SIGHUP. เบญเบฑเบ™เบ—เปเบฒเบญเบดเบ”เป€เบฎเบฑเบ”เปƒเบซเป‰เบเบฒเบ™เป€เบ‚เบปเป‰เบฒเบšเบฑเบ™เบ—เบถเบเบเปˆเบฝเบงเบเบฑเบšเบเบฒเบ™เบชเบดเป‰เบ™เบชเบธเบ”เบ‚เบญเบ‡เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เป€เบ”เบฑเบเบ™เป‰เบญเบ, เบญเบฑเบ™เบ—เบตเบชเบญเบ‡เบ›เบดเบ”เบ•เบปเบงเบญเบฐเบ—เบดเบšเบฒเบเป„เบŸเบฅเปŒเบ‚เบญเบ‡เป„เบŸเบฅเปŒเบšเบฑเบ™เบ—เบถเบ:

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

cron daemon เป€เบฎเบฑเบ”เบงเบฝเบเบขเบนเปˆเบ„เบปเบ™เบ”เบฝเบงเบขเบนเปˆเปƒเบ™เบฅเบฐเบšเบปเบš, เบžเบฝเบ‡เปเบ•เปˆเป€เบ›เบฑเบ™ superuser เปเบฅเบฐเบˆเบฒเบเป„เบ”เป€เบฅเบเบฐเบ—เปเบฅเบต cron เบ•เบปเป‰เบ™เบ•เป. เบเบฒเบ™เป‚เบ—เบ•เปเปˆเป„เบ›เบ™เบตเป‰เบชเป‰เบฒเบ‡เป„เบŸเบฅเปŒเบฅเบฑเบญเบเบ”เป‰เบงเบ PID เบ‚เบญเบ‡เบ‚เบฐเบšเบงเบ™เบเบฒเบ™ daemon, เปƒเบซเป‰เปเบ™เปˆเปƒเบˆเบงเปˆเบฒเบœเบนเป‰เปƒเบŠเป‰เบ–เบทเบเบ•เป‰เบญเบ‡เปเบฅเบฐเบ›เปˆเบฝเบ™เป„เบ”เป€เบฅเบเบฐเบ—เปเบฅเบตเบ›เบฐเบˆเบธเบšเบฑเบ™เป€เบ›เบฑเบ™เบ•เบปเป‰เบ™เบ•เป:

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

เป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบ–เบทเบเบ•เบฑเป‰เบ‡เป„เบงเป‰, เป€เบŠเบดเปˆเบ‡เบˆเบฐเบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เปƒเบ™เป€เบงเบฅเบฒเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบ‚เบฐเบšเบงเบ™เบเบฒเบ™:

setenv("PATH", _PATH_DEFPATH, 1);

เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™, เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เปเบกเปˆเบ™ "daemonized": เบกเบฑเบ™เบชเป‰เบฒเบ‡เบชเปเบฒเป€เบ™เบปเบฒเป€เบ”เบฑเบเบ™เป‰เบญเบเบ‚เบญเบ‡เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เป‚เบ”เบเบเบฒเบ™เป‚เบ—เบซเบฒ fork เปเบฅเบฐเบเบญเบ‡เบ›เบฐเบŠเบธเบกเปƒเบซเบกเปˆเปƒเบ™เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เป€เบ”เบฑเบ (เป‚เบ—เบซเบฒ 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 เบเป‰เบฒเบเป„เบ›เบชเบนเปˆเบงเบปเบ‡เบˆเบญเบ™เบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบ•เบปเป‰เบ™เบ•เป. เปเบ•เปˆเบเปˆเบญเบ™เบ™เบฑเป‰เบ™, เบกเบฑเบ™เป€เบ›เบฑเบ™เบกเบนเบ™เบ„เปˆเบฒเบ—เบตเปˆเบžเบดเบˆเบฒเบฅเบฐเบ™เบฒเบเบฒเบ™เป‚เบซเบผเบ”เบฅเบฒเบเบเบฒเบ™เบงเบฝเบ.

เบเบฒเบ™โ€‹เป€เบเบฑเบšโ€‹เบเปเบฒโ€‹เปเบฅเบฐโ€‹เบเบฒเบ™โ€‹เบ›เบฑเบšโ€‹เบ›เบธเบ‡โ€‹เบšเบฑเบ™โ€‹เบŠเบตโ€‹เบฅเบฒเบโ€‹เบเบฒเบ™โ€‹เบงเบฝเบโ€‹เบ‡เบฒเบ™โ€‹

เบŸเบฑเบ‡เบŠเบฑเบ™ 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;
    }
}

เปƒเบ™เบ—เบตเปˆเบ™เบตเป‰, เบ•เบปเบงเปเบ›เบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบกเป„เบ”เป‰เบ–เบทเบเบเปเบฒเบ™เบปเบ” (เป€เบชเบฑเป‰เบ™เบ‚เบญเบ‡เปเบšเบšเบŸเบญเบก VAR=value) เป‚เบ”เบเปƒเบŠเป‰เบŸเบฑเบ‡เบŠเบฑเบ™ load_env / env_set, เบซเบผเบทเบ„เปเบฒเบญเบฐเบ—เบดเบšเบฒเบเบซเบ™เป‰เบฒเบงเบฝเบเบ–เบทเบเบญเปˆเบฒเบ™ (* * * * * /path/to/exec) เป‚เบ”เบเปƒเบŠเป‰เบŸเบฑเบ‡เบŠเบฑเบ™ load_entry.

เบซเบ™เปˆเบงเบเบ‡เบฒเบ™เบ‚เบฒเป€เบ‚เบปเป‰เบฒเบ—เบตเปˆ load_entry เบเบฑเบšเบ„เบทเบ™เบกเบฒเปเบกเปˆเบ™เบงเบฝเบเบ‡เบฒเบ™เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ, เป€เบŠเบดเปˆเบ‡เบ–เบทเบเบˆเบฑเบ”เปƒเบชเปˆเปƒเบ™เบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆเบ—เบปเปˆเบงเป„เบ›เบ‚เบญเบ‡เบงเบฝเบเบ‡เบฒเบ™. เบŸเบฑเบ‡เบŠเบฑเบ™เบ•เบปเบงเบกเบฑเบ™เป€เบญเบ‡เบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐ verbose เบ‚เบญเบ‡เบฎเบนเบšเปเบšเบšเป€เบงเบฅเบฒ, เปเบ•เปˆเบžเบงเบเป€เบฎเบปเบฒเบกเบตเบ„เบงเบฒเบกเบชเบปเบ™เปƒเบˆเบซเบผเบฒเบเปƒเบ™เบเบฒเบ™เบชเป‰เบฒเบ‡เบ•เบปเบงเปเบ›เบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบกเปเบฅเบฐเบ•เบปเบงเบเปเบฒเบ™เบปเบ”เบเบฒเบ™เป€เบ›เบตเบ”เบ•เบปเบง:

/* ะฟะพะปัŒะทะพะฒะฐั‚ะตะปัŒ ะธ ะณั€ัƒะฟะฟะฐ ะดะปั ะทะฐะฟัƒัะบะฐ ะทะฐะดะฐั‡ะธ ะฑะตั€ัƒั‚ัั ะธะท 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);

loop เบ•เบปเป‰เบ™เบ•เปเป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบšเบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆเบ‚เบญเบ‡เบงเบฝเบเบ‡เบฒเบ™เปƒเบ™เบ›เบฐเบˆเบธเบšเบฑเบ™.

เบชเบฒเบเบซเบผเบฑเบ

cron เบ•เบปเป‰เบ™เบชเบฐเบšเบฑเบšเบˆเบฒเบ Version 7 Unix เป€เบฎเบฑเบ”เบงเบฝเบเบ‚เป‰เบญเบ™เบ‚เป‰เบฒเบ‡เบ‡เปˆเบฒเบเบ”เบฒเบ: เบกเบฑเบ™ re-read the configuration in a loop, launching the tasks of the current minutes as a superuser, and sleep until the start of the next minutes. เบงเบดเบ—เบตเบ‡เปˆเบฒเบเป†เบ™เบตเป‰เปƒเบ™เป€เบ„เบทเปˆเบญเบ‡เป€เบเบปเปˆเบฒเบ•เป‰เบญเบ‡เบเบฒเบ™เบŠเบฑเบšเบžเบฐเบเบฒเบเบญเบ™เบซเบผเบฒเบเป€เบเบตเบ™เป„เบ›.

เบชเบฐเบšเบฑเบšเบ—เบฒเบ‡เป€เบฅเบทเบญเบเป„เบ”เป‰เบ–เบทเบเบชเบฐเป€เบซเบ™เบตเปƒเบ™ 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 เบ—เบตเปˆเบ”เบต, เบ™เบฑเป‰เบ™เปเบกเปˆเบ™, เบกเบฑเบ™เป€เบฎเบฑเบ”เบเบฒเบ™เบชเป‰เบญเบกเปเบŠเบกเป€เบžเบทเปˆเบญเบ›เบฐเบ•เบดเบšเบฑเบ”เบซเบ™เป‰เบฒเบงเบฝเบเปเบšเบš asynchronous. เบ‚เบฐโ€‹เบšเบงเบ™โ€‹เบเบฒเบ™โ€‹เบžเปเปˆโ€‹เปเบกเปˆโ€‹เบเบฑเบ‡โ€‹เบชเบทเบšโ€‹เบ•เปเปˆโ€‹เป€เบ›เบตเบ”โ€‹เบ›เบฐโ€‹เบ•เบดโ€‹เบšเบฑเบ”โ€‹เบงเบฝเบโ€‹เบ‡เบฒเบ™โ€‹, เบ‚เบฐโ€‹เบšเบงเบ™โ€‹เบเบฒเบ™โ€‹เป€เบ”เบฑเบโ€‹เบ™เป‰เบญเบโ€‹เบเบฐโ€‹เบเบฝเบกโ€‹เบ‚เบฐโ€‹เบšเบงเบ™โ€‹เบเบฒเบ™โ€‹เบงเบฝเบโ€‹เบ‡เบฒเบ™โ€‹:

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 เบ—เบฑเบ‡เบซเบกเบปเบ”. เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เบฅเบฐเป€เบงเบฑเป‰เบ™เบšเบฒเบ‡เบฅเบฒเบเบฅเบฐเบญเบฝเบ”เบ—เบตเปˆเบซเบ™เป‰เบฒเบชเบปเบ™เปƒเบˆ, เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบเบปเบเบ•เบปเบงเบขเปˆเบฒเบ‡, เบšเบฑเบ™เบŠเบตเบชเปเบฒเบฅเบฑเบšเบœเบนเป‰เปƒเบŠเป‰เบซเปˆเบฒเบ‡เป„เบเบชเบญเบเบซเบผเบตเบ, เปเบ•เปˆเบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เบญเบฐเบ—เบดเบšเบฒเบเบชเบดเปˆเบ‡เบ—เบตเปˆเบ•เบปเป‰เบ™เบ•เป.

Afterword

Cron เป€เบ›เบฑเบ™เป‚เบ„เบ‡เบเบฒเบ™เบ—เบตเปˆเบ‡เปˆเบฒเบเบ”เบฒเบเปเบฅเบฐเป€เบ›เบฑเบ™เบ›เบฐเป‚เบซเบเบ”เบ—เบตเปˆเบซเบ™เป‰เบฒเบ›เบฐเบซเบฅเบฒเบ”เปƒเบˆ, เป€เบฎเบฑเบ”เปƒเบ™เบ›เบฐเป€เบžเบ™เบตเบ—เบตเปˆเบ”เบตเบ—เบตเปˆเบชเบธเบ”เบ‚เบญเบ‡เป‚เบฅเบ Unix. เบ™เบฒเบ‡เบšเปเปˆเป„เบ”เป‰เป€เบฎเบฑเบ”เบซเบเบฑเบ‡เบžเบดเป€เบชเบ”, เปเบ•เปˆเบ™เบฒเบ‡เป„เบ”เป‰เป€เบฎเบฑเบ”เบงเบฝเบเบ‚เบญเบ‡เบ™เบฒเบ‡เบขเปˆเบฒเบ‡เบกเบฐเบซเบฑเบ”เบชเบฐเบˆเบฑเบ™เบซเบผเบฒเบเบชเบดเบšเบ›เบตเปเบฅเป‰เบง. เบเบฒเบ™เป„เบ”เป‰เบฎเบฑเบšเบฅเบฐเบซเบฑเบ”เบชเปเบฒเบฅเบฑเบšเบฎเบธเปˆเบ™เบ—เบตเปˆเบกเบฒเบžเป‰เบญเบกเบเบฑเบš Ubuntu เปƒเบŠเป‰เป€เบงเบฅเบฒเบšเปเปˆเป€เบเบตเบ™เบซเบ™เบถเปˆเบ‡เบŠเบปเปˆเบงเป‚เบกเบ‡, เปเบฅเบฐเบ‚เป‰เบญเบเบกเบตเบ„เบงเบฒเบกเบกเปˆเบงเบ™เบซเบผเบฒเบ! เบ‚เป‰เบญเบเบซเบงเบฑเบ‡เบงเปˆเบฒเบ‚เป‰เบญเบเบชเบฒเบกเบฒเบ”เปเบšเปˆเบ‡เบ›เบฑเบ™เบกเบฑเบ™เบเบฑเบšเบ—เปˆเบฒเบ™.

เบ‚เป‰เบญเบเบšเปเปˆเบฎเบนเป‰เบเปˆเบฝเบงเบเบฑเบšเป€เบˆเบปเป‰เบฒ, เปเบ•เปˆเบ‚เป‰เบญเบเป€เบชเบเปƒเบˆเป€เบฅเบฑเบเบ™เป‰เบญเบเบ—เบตเปˆเบฎเบนเป‰เบงเปˆเบฒเบเบฒเบ™เบ‚เบฝเบ™เป‚เบ›เบฅเปเบเบฅเบกเบ—เบตเปˆเบ—เบฑเบ™เบชเบฐเป„เบซเบก, เป‚เบ”เบเบกเบตเปเบ™เบงเป‚เบ™เป‰เบกเบ—เบตเปˆเบˆเบฐเบชเบฑเบšเบชเบปเบ™เปเบฅเบฐเบšเปเปˆเบกเบตเบ•เบปเบงเบ•เบปเบ™เป€เบเบตเบ™เป„เบ›, เบšเปเปˆเป„เบ”เป‰เป€เบญเบทเป‰เบญเบญเปเบฒเบ™เบงเบเปƒเบซเป‰เปเบเปˆเบ„เบงเบฒเบกเบ‡เปˆเบฒเบเบ”เบฒเบเบ”เบฑเปˆเบ‡เบเปˆเบฒเบงเป€เบ›เบฑเบ™เป€เบงเบฅเบฒเบ”เบปเบ™เบ™เบฒเบ™.

เบกเบตเบ—เบฒเบ‡เป€เบฅเบทเบญเบเบ—เบตเปˆเบ—เบฑเบ™เบชเบฐเป„เบซเบกเบซเบผเบฒเบเบชเปเบฒเบฅเบฑเบš cron: systemd-timers เบŠเปˆเบงเบเปƒเบซเป‰เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบˆเบฑเบ”เบฅเบฐเบšเบฝเบšเบฅเบฐเบšเบปเบšเบ—เบตเปˆเบŠเบฑเบšเบŠเป‰เบญเบ™เบ”เป‰เบงเบเบเบฒเบ™เป€เบžเบดเปˆเบ‡เบžเบฒเบญเบฒเป„เบช, fcron เบŠเปˆเบงเบเปƒเบซเป‰เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ„เบงเบšเบ„เบธเบกเบเบฒเบ™เบšเปเบฅเบดเป‚เบžเบเบŠเบฑเบšเบžเบฐเบเบฒเบเบญเบ™เป„เบ”เป‰เป‚เบ”เบเบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบ. เปเบ•เปˆเบชเปˆเบงเบ™เบ•เบปเบง, crontab เบ—เบตเปˆเบ‡เปˆเบฒเบเบ”เบฒเบเบ—เบตเปˆเบชเบธเบ”เปเบกเปˆเบ™เบžเบฝเบ‡เบžเปเบชเปเบฒเบฅเบฑเบšเบ‚เป‰เบญเบเบชเบฐเป€เบซเบกเบต.

เปƒเบ™เบชเบฑเป‰เบ™, เบฎเบฑเบ Unix, เปƒเบŠเป‰เป‚เบ›เปเบเบผเบกเบ‡เปˆเบฒเบเป†เปเบฅเบฐเบขเปˆเบฒเบฅเบทเบกเบญเปˆเบฒเบ™ mana เบชเปเบฒเบฅเบฑเบšเป€เบงเบ—เบตเบ‚เบญเบ‡เบ—เปˆเบฒเบ™!

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™