Linux์˜ Cron: ๊ธฐ๋ก, ์‚ฌ์šฉ ๋ฐ ์žฅ์น˜

Linux์˜ Cron: ๊ธฐ๋ก, ์‚ฌ์šฉ ๋ฐ ์žฅ์น˜

๊ณ ์ „์€ ํ–‰๋ณตํ•œ ์‹œ๊ฐ„์ด ์ง€์ผœ์ง€์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ผ์Šต๋‹ˆ๋‹ค. ๊ทธ ์‹œ์ ˆ์—๋Š” ํ”„๋กœ๊ทธ๋ž˜๋จธ๋„ ์œ ๋‹‰์Šค๋„ ์—†์—ˆ์ง€๋งŒ ์˜ค๋Š˜๋‚  ํ”„๋กœ๊ทธ๋ž˜๋จธ๋“ค์€ ํ™•์‹คํžˆ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. cron์ด ๊ทธ๋“ค ๋Œ€์‹  ์‹œ๊ฐ„์„ ์ถ”์ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ช…๋ น์ค„ ์œ ํ‹ธ๋ฆฌํ‹ฐ๋Š” ๋‚˜์—๊ฒŒ ์•ฝ์ ์ด์ž ๊ท€์ฐฎ์€ ์ผ์ž…๋‹ˆ๋‹ค. sed, awk, wc, cut ๋ฐ ๊ธฐํƒ€ ์˜ค๋ž˜๋œ ํ”„๋กœ๊ทธ๋žจ์€ ๋งค์ผ ์šฐ๋ฆฌ ์„œ๋ฒ„์˜ ์Šคํฌ๋ฆฝํŠธ์— ์˜ํ•ด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ๊ทธ ์ค‘ ๋‹ค์ˆ˜๋Š” ์›๋ž˜ 70๋…„๋Œ€์˜ ์Šค์ผ€์ค„๋Ÿฌ์ธ cron์„ ์œ„ํ•œ ์ž‘์—…์œผ๋กœ ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์˜ค๋žซ๋™์•ˆ ์ž์„ธํ•œ ๋‚ด์šฉ์„ ๋‹ค๋ฃจ์ง€ ์•Š๊ณ  ํ”ผ์ƒ์ ์œผ๋กœ cron์„ ์‚ฌ์šฉํ•ด์™”๋Š”๋ฐ, ์–ด๋Š ๋‚  ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋‹ค๊ฐ€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์ž ๊ผผ๊ผผํžˆ ์‚ดํŽด๋ณด๊ธฐ๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ธ€์„ ์“ฐ๋Š” ๋™์•ˆ ๋‚˜๋Š” ์ธ๊ธฐ ์žˆ๋Š” Linux ๋ฐฐํฌํŒ์˜ ์ฃผ์š” ํฌ๋ก  ์˜ต์…˜์ธ POSIX crontab๊ณผ ๊ทธ ์ค‘ ์ผ๋ถ€์˜ ๊ตฌ์กฐ์— ์ต์ˆ™ํ•ด์กŒ์Šต๋‹ˆ๋‹ค.

Linux๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  cron ์ž‘์—…์„ ์‹คํ–‰ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? Unix์˜ ์‹œ์Šคํ…œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์•„ํ‚คํ…์ฒ˜์— ๊ด€์‹ฌ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๊ทธ๋Ÿผ ์ถœ๋ฐœํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค!

๋‚ด์šฉ

์ข…์˜ ๊ธฐ์›

์‚ฌ์šฉ์ž ๋˜๋Š” ์‹œ์Šคํ…œ ํ”„๋กœ๊ทธ๋žจ์˜ ์ฃผ๊ธฐ์ ์ธ ์‹คํ–‰์€ ๋ชจ๋“  ์šด์˜ ์ฒด์ œ์—์„œ ๋ช…๋ฐฑํžˆ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋“ค์€ ์ค‘์•™์—์„œ ์ž‘์—…์„ ๊ณ„ํšํ•˜๊ณ  ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์„œ๋น„์Šค์˜ ํ•„์š”์„ฑ์„ ์˜ค๋ž˜ ์ „๋ถ€ํ„ฐ ์ธ์‹ํ–ˆ์Šต๋‹ˆ๋‹ค.

Unix ๊ณ„์—ด ์šด์˜ ์ฒด์ œ์˜ ๊ธฐ์›์€ ์œ ๋ช…ํ•œ Ken Thompson์„ ํฌํ•จํ•˜์—ฌ ์ง€๋‚œ ์„ธ๊ธฐ 7๋…„๋Œ€ Bell Labs์—์„œ ๊ฐœ๋ฐœ๋œ ๋ฒ„์ „ 70 Unix๋กœ ๊ฑฐ์Šฌ๋Ÿฌ ์˜ฌ๋ผ๊ฐ‘๋‹ˆ๋‹ค. ๋ฒ„์ „ 7 Unix์—๋Š” ์ •๊ธฐ์ ์œผ๋กœ ์Šˆํผ์œ ์ € ์ž‘์—…์„ ์‹คํ–‰ํ•˜๋Š” ์„œ๋น„์Šค์ธ cron๋„ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์ธ ์ตœ์‹  cron์€ ๊ฐ„๋‹จํ•œ ํ”„๋กœ๊ทธ๋žจ์ด์ง€๋งŒ ์›๋ž˜ ๋ฒ„์ „์˜ ์šด์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ํ›จ์”ฌ ๋” ๊ฐ„๋‹จํ–ˆ์Šต๋‹ˆ๋‹ค. ์„œ๋น„์Šค๋Š” XNUMX๋ถ„์— ํ•œ ๋ฒˆ์”ฉ ๊นจ์–ด๋‚˜๊ณ  ๋‹จ์ผ ํŒŒ์ผ(/etc/lib/crontab)์—์„œ ์ž‘์—…์ด ํฌํ•จ๋œ ํ…Œ์ด๋ธ”์„ ์ฝ๊ณ  ๋‹ค์Œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ์ˆœ๊ฐ„์— ์ˆ˜ํ–‰๋˜์–ด์•ผ ํ•˜๋Š” ์ž‘์—…์„ ์ˆ˜ํผ์œ ์ €๋กœ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ ํ›„ ๋ชจ๋“  Unix ๊ณ„์—ด ์šด์˜ ์ฒด์ œ์—๋Š” ๊ฐ„๋‹จํ•˜๊ณ  ์œ ์šฉํ•œ ์„œ๋น„์Šค์˜ ํ–ฅ์ƒ๋œ ๋ฒ„์ „์ด ์ œ๊ณต๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

crontab ํ˜•์‹์— ๋Œ€ํ•œ ์ผ๋ฐ˜ํ™”๋œ ์„ค๋ช…๊ณผ ์œ ํ‹ธ๋ฆฌํ‹ฐ ์ž‘๋™์˜ ๊ธฐ๋ณธ ์›๋ฆฌ๋Š” 1992๋…„ ์œ ๋‹‰์Šค ๊ณ„์—ด ์šด์˜ ์ฒด์ œ์˜ ์ฃผ์š” ํ‘œ์ค€์ธ POSIX์— ํฌํ•จ๋˜์–ด ์‚ฌ์‹ค์ƒ ํ‘œ์ค€์˜ cron์ด ๋ฒ•์  ํ‘œ์ค€์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

1987๋…„์— Unix ์‚ฌ์šฉ์ž๋“ค์—๊ฒŒ cron์— ๋Œ€ํ•œ ํฌ๋ง์‚ฌํ•ญ์„ ์กฐ์‚ฌํ•œ Paul Vixie๋Š” ๊ธฐ์กด cron์˜ ์ผ๋ถ€ ๋ฌธ์ œ๋ฅผ ์ˆ˜์ •ํ•˜๊ณ  ํ…Œ์ด๋ธ” ํŒŒ์ผ์˜ ๊ตฌ๋ฌธ์„ ํ™•์žฅํ•œ ๋˜ ๋‹ค๋ฅธ ๋ฒ„์ „์˜ ๋ฐ๋ชฌ์„ ์ถœ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค.

Vixie cron์˜ ์„ธ ๋ฒˆ์งธ ๋ฒ„์ „์—์„œ๋Š” POSIX ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ถฉ์กฑํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ํ”„๋กœ๊ทธ๋žจ์—๋Š” ์ž์œ  ๋ผ์ด์„ผ์Šค๊ฐ€ ์žˆ๊ฑฐ๋‚˜ README์˜ ํฌ๋ง ์‚ฌํ•ญ์„ ์ œ์™ธํ•˜๊ณ ๋Š” ๋ผ์ด์„ผ์Šค๊ฐ€ ์ „ํ˜€ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ์ž‘์„ฑ์ž๋Š” ๋ณด์ฆ์„ ์ œ๊ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ž‘์„ฑ์ž ์ด๋ฆ„ ์‚ญ์ œํ•  ์ˆ˜ ์—†์œผ๋ฉฐ, ํ”„๋กœ๊ทธ๋žจ์€ ์†Œ์Šค์ฝ”๋“œ์™€ ํ•จ๊ป˜ ํŒ๋งค๋งŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์š”๊ตฌ ์‚ฌํ•ญ์€ ๊ทธ ๋‹น์‹œ ์ธ๊ธฐ๋ฅผ ์–ป์—ˆ๋˜ ์ž์œ  ์†Œํ”„ํŠธ์›จ์–ด์˜ ์›์น™๊ณผ ํ˜ธํ™˜๋˜๋Š” ๊ฒƒ์œผ๋กœ ํŒ๋ช…๋˜์—ˆ์œผ๋ฏ€๋กœ 90๋…„๋Œ€ ์ดˆ๋ฐ˜์— ๋“ฑ์žฅํ•œ ์ผ๋ถ€ ์ฃผ์š” Linux ๋ฐฐํฌํŒ์€ Vixie cron์„ ์‹œ์Šคํ…œ ์‹œ์Šคํ…œ์œผ๋กœ ์ฑ„ํƒํ–ˆ์œผ๋ฉฐ ์˜ค๋Š˜๋‚ ์—๋„ ์—ฌ์ „ํžˆ ๊ฐœ๋ฐœ ์ค‘์ž…๋‹ˆ๋‹ค.

ํŠนํžˆ Red Hat๊ณผ SUSE๋Š” Vixie cron์˜ ํฌํฌ์ธ cronie๋ฅผ ๊ฐœ๋ฐœํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, Debian๊ณผ Ubuntu๋Š” ๋งŽ์€ ํŒจ์น˜๊ฐ€ ํฌํ•จ๋œ Vixie cron์˜ ์›๋ณธ ๋ฒ„์ „์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋จผ์ € POSIX์— ์„ค๋ช…๋œ ์‚ฌ์šฉ์ž ์œ ํ‹ธ๋ฆฌํ‹ฐ crontab์— ๋Œ€ํ•ด ์•Œ์•„๋ณธ ํ›„ Vixie cron์—์„œ ์ œ๊ณต๋˜๋Š” ๊ตฌ๋ฌธ ํ™•์žฅ๊ณผ ์ธ๊ธฐ ์žˆ๋Š” Linux ๋ฐฐํฌํŒ์—์„œ Vixie cron์˜ ๋ณ€ํ˜• ์‚ฌ์šฉ์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋งˆ์ง€๋ง‰์œผ๋กœ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฒƒ์€ cron ๋ฐ๋ชฌ ์žฅ์น˜์— ๋Œ€ํ•œ ๋ถ„์„์ž…๋‹ˆ๋‹ค.

POSIX ํฌ๋ก ํƒญ

์›๋ž˜ ํฌ๋ก ์ด ํ•ญ์ƒ ์ˆ˜ํผ์œ ์ €๋ฅผ ์œ„ํ•ด ์ž‘๋™ํ–ˆ๋‹ค๋ฉด ์ตœ์‹  ์Šค์ผ€์ค„๋Ÿฌ๋Š” ์ผ๋ฐ˜ ์‚ฌ์šฉ์ž์˜ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์•„ ๋” ์•ˆ์ „ํ•˜๊ณ  ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

ํฌ๋ก ์€ ์ง€์†์ ์œผ๋กœ ์‹คํ–‰๋˜๋Š” ํฌ๋ก  ๋ฐ๋ชฌ๊ณผ ์‚ฌ์šฉ์ž๊ฐ€ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” 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], ์—ฌ๊ธฐ์„œ XNUMX์€ ์ผ์š”์ผ์ž…๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰ ์—ฌ์„ฏ ๋ฒˆ์งธ ํ•„๋“œ๋Š” ํ‘œ์ค€ ๋ช…๋ น ํ•ด์„๊ธฐ์— ์˜ํ•ด ์‹คํ–‰๋˜๋Š” ์ค„์ž…๋‹ˆ๋‹ค.

์ฒ˜์Œ XNUMX๊ฐœ ํ•„๋“œ์—๋Š” ๊ฐ’์„ ์‰ผํ‘œ๋กœ ๊ตฌ๋ถ„ํ•˜์—ฌ ๋‚˜์—ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

# ะทะฐะดะฐั‡ะฐ, ะฒั‹ะฟะพะปะฝัะตะผะฐั ะฒ ะฟะตั€ะฒัƒัŽ ะธ ะดะตััั‚ัƒัŽ ะผะธะฝัƒั‚ั‹ ะบะฐะถะดะพะณะพ ั‡ะฐัะฐ
1,10 * * * * /path/to/exec -a -b -c

๋˜๋Š” ํ•˜์ดํ”ˆ์„ ์‚ฌ์šฉํ•˜์—ฌ:

# ะทะฐะดะฐั‡ะฐ, ะฒั‹ะฟะพะปะฝัะตะผะฐั ะฒ ะบะฐะถะดัƒัŽ ะธะท ะฟะตั€ะฒั‹ั… ะดะตััั‚ะธ ะผะธะฝัƒั‚ ะบะฐะถะดะพะณะพ ั‡ะฐัะฐ
0-9 * * * * /path/to/exec -a -b -c

์ž‘์—… ์ผ์ •์— ๋Œ€ํ•œ ์‚ฌ์šฉ์ž ์•ก์„ธ์Šค๋Š” POSIX์—์„œ cron.allow ๋ฐ cron.deny ํŒŒ์ผ์— ์˜ํ•ด ๊ทœ์ œ๋ฉ๋‹ˆ๋‹ค. ์ด ํŒŒ์ผ์—๋Š” ๊ฐ๊ฐ crontab์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋Š” ์‚ฌ์šฉ์ž์™€ ํ”„๋กœ๊ทธ๋žจ์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์—†๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๋‚˜์—ด๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ‘œ์ค€์€ ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ๋“  ์ด๋Ÿฌํ•œ ํŒŒ์ผ์˜ ์œ„์น˜๋ฅผ โ€‹โ€‹๊ทœ์ œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ‘œ์ค€์— ๋”ฐ๋ฅด๋ฉด ์‹คํ–‰๋œ ํ”„๋กœ๊ทธ๋žจ์—๋Š” ์ตœ์†Œ XNUMX๊ฐœ์˜ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๊ฐ€ ์ „๋‹ฌ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  1. HOME - ์‚ฌ์šฉ์ž์˜ ํ™ˆ ๋””๋ ‰ํ† ๋ฆฌ์ž…๋‹ˆ๋‹ค.
  2. LOGNAME โ€” ์‚ฌ์šฉ์ž ๋กœ๊ทธ์ธ.
  3. PATH๋Š” ํ‘œ์ค€ ์‹œ์Šคํ…œ ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ๋กœ์ž…๋‹ˆ๋‹ค.
  4. SHELL โ€” ์‚ฌ์šฉ๋œ ๋ช…๋ น ํ•ด์„๊ธฐ์˜ ๊ฒฝ๋กœ์ž…๋‹ˆ๋‹ค.

ํŠนํžˆ POSIX๋Š” ์ด๋Ÿฌํ•œ ๋ณ€์ˆ˜์˜ ๊ฐ’์ด ์–ด๋””์„œ ์™”๋Š”์ง€์— ๋Œ€ํ•ด ์•„๋ฌด ๋ง๋„ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ฒ ์ŠคํŠธ์…€๋Ÿฌ - Vixie cron 3.0pl1

์ธ๊ธฐ ์žˆ๋Š” cron ๋ณ€์ข…์˜ ๊ณตํ†ต ์กฐ์ƒ์€ 3.0๋…„ comp.sources.unix ๋ฉ”์ผ๋ง ๋ฆฌ์ŠคํŠธ์— ์†Œ๊ฐœ๋œ Vixie cron 1pl1992์ž…๋‹ˆ๋‹ค. ์ด ๋ฒ„์ „์˜ ์ฃผ์š” ๊ธฐ๋Šฅ์„ ๋” ์ž์„ธํžˆ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

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์€ ๋‹จ์ˆœํžˆ ๋ฐ๋ชฌ์— ์˜ํ•ด ์ œ๊ณต๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ํŒŒ์ผ์—์„œ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. passwd. PATH ๋ณ€์ˆ˜๋Š” "/usr/bin:/bin"์œผ๋กœ ์„ค์ •๋˜๊ณ  SHELL ๋ณ€์ˆ˜๋Š” "/bin/sh"๋กœ ์„ค์ •๋ฉ๋‹ˆ๋‹ค. LOGNAME์„ ์ œ์™ธํ•œ ๋ชจ๋“  ๋ณ€์ˆ˜์˜ ๊ฐ’์€ ์‚ฌ์šฉ์ž ํ…Œ์ด๋ธ”์—์„œ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

์ผ๋ถ€ ํ™˜๊ฒฝ ๋ณ€์ˆ˜(์ฃผ๋กœ SHELL ๋ฐ HOME)๋Š” cron ์ž์ฒด์—์„œ ์ž‘์—…์„ ์‹คํ–‰ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ํ‘œ์ค€ sh ๋Œ€์‹  bash๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ง€์ • ์ž‘์—…์„ ์‹คํ–‰ํ•˜๋Š” ๋ชจ์Šต์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

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

๊ถ๊ทน์ ์œผ๋กœ ํ…Œ์ด๋ธ”์— ์ •์˜๋œ ๋ชจ๋“  ํ™˜๊ฒฝ ๋ณ€์ˆ˜(cron์—์„œ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ํ”„๋กœ์„ธ์Šค์—์„œ ํ•„์š”)๊ฐ€ ์‹คํ–‰ ์ค‘์ธ ์ž‘์—…์— ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.

ํŒŒ์ผ์„ ํŽธ์ง‘ํ•˜๊ธฐ ์œ„ํ•ด crontab์€ VISUAL ๋˜๋Š” EDITOR ํ™˜๊ฒฝ ๋ณ€์ˆ˜์— ์ง€์ •๋œ ํŽธ์ง‘๊ธฐ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. crontab์ด ์‹คํ–‰๋œ ํ™˜๊ฒฝ์— ์ด๋Ÿฌํ•œ ๋ณ€์ˆ˜๊ฐ€ ์ •์˜๋˜์–ด ์žˆ์ง€ ์•Š์œผ๋ฉด "/usr/ucb/vi"๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค(ucb๋Š” ์•„๋งˆ๋„ University of California, Berkeley์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค).

๋ฐ๋น„์•ˆ๊ณผ ์šฐ๋ถ„ํˆฌ์˜ ํฌ๋ก 

๋ฐ๋น„์•ˆ ๋ฐ ํŒŒ์ƒ ๋ฐฐํฌํŒ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ถœ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ณ ๋„๋กœ ์ˆ˜์ •๋œ ๋ฒ„์ „ Vixie ํฌ๋ก  ๋ฒ„์ „ 3.0pl1. ํ…Œ์ด๋ธ” ํŒŒ์ผ์˜ ๊ตฌ๋ฌธ์—๋Š” ์ฐจ์ด๊ฐ€ ์—†์œผ๋ฉฐ ์‚ฌ์šฉ์ž์˜ ๊ฒฝ์šฐ ๋™์ผํ•œ Vixie cron์ž…๋‹ˆ๋‹ค. ๊ฐ€์žฅ ํฐ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ: ์ง€์› syslog, SELinux๋ฅผ ะธ WFP.

๋ˆˆ์— ๋„์ง€๋Š” ์•Š์ง€๋งŒ ์‹ค์งˆ์ ์ธ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์—๋Š” ๊ตฌ์„ฑ ํŒŒ์ผ ๋ฐ ์ž‘์—… ํ…Œ์ด๋ธ”์˜ ์œ„์น˜๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

Debian์˜ ์‚ฌ์šฉ์ž ํ…Œ์ด๋ธ”์€ /var/spool/cron/crontabs ๋””๋ ‰ํ† ๋ฆฌ์— ์žˆ์œผ๋ฉฐ, ์‹œ์Šคํ…œ ํ…Œ์ด๋ธ”์€ ์—ฌ์ „ํžˆ โ€‹โ€‹/etc/crontab์— ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ๋น„์•ˆ ํŒจํ‚ค์ง€๋ณ„ ์ž‘์—… ํ…Œ์ด๋ธ”์€ /etc/cron.d์— ์žˆ์œผ๋ฉฐ cron ๋ฐ๋ชฌ์ด ์ž๋™์œผ๋กœ ํ…Œ์ด๋ธ”์„ ์ฝ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ์•ก์„ธ์Šค ์ œ์–ด๋Š” /etc/cron.allow ๋ฐ /etc/cron.deny ํŒŒ์ผ์— ์˜ํ•ด ์ œ์–ด๋ฉ๋‹ˆ๋‹ค.

๊ธฐ๋ณธ ์…ธ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹/bin/sh์ด๋ฉฐ Debian์—์„œ๋Š” ์ž‘์€ POSIX ํ˜ธํ™˜ ์…ธ์ž…๋‹ˆ๋‹ค. ๋Œ€์‹œ, ๊ตฌ์„ฑ์„ ์ฝ์ง€ ์•Š๊ณ  ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค(๋น„๋Œ€ํ™”ํ˜• ๋ชจ๋“œ์—์„œ).

์ตœ์‹  ๋ฒ„์ „์˜ Debian์—์„œ Cron ์ž์ฒด๋Š” systemd๋ฅผ ํ†ตํ•ด ์‹œ์ž‘๋˜๋ฉฐ, ์‹œ์ž‘ ๊ตฌ์„ฑ์€ /lib/systemd/system/cron.service์—์„œ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„œ๋น„์Šค ๊ตฌ์„ฑ์—๋Š” ํŠน๋ณ„ํ•œ ๊ฒƒ์ด ์—†์œผ๋ฉฐ, ๊ฐ ์‚ฌ์šฉ์ž์˜ crontab์— ์ง์ ‘ ์„ ์–ธ๋œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด ๋ณด๋‹ค ์„ธ๋ฐ€ํ•œ ์ž‘์—… ๊ด€๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

RedHat, Fedora ๋ฐ CentOS์˜ ํฌ๋กœ๋‹ˆ

ํฌ๋กœ๋‹ˆ โ€” Vixie cron ๋ฒ„์ „ 4.1์˜ ํฌํฌ. Debian์—์„œ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๊ตฌ๋ฌธ์€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜์ง€๋งŒ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์ž‘๋™ํ•˜๋Š” PAM ๋ฐ SELinux์— ๋Œ€ํ•œ ์ง€์›, inotify ๋ฐ ๊ธฐํƒ€ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•œ ํŒŒ์ผ ์ถ”์ ์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ๋ณธ ๊ตฌ์„ฑ์€ ์ผ๋ฐ˜์ ์ธ ์œ„์น˜์— ์žˆ์Šต๋‹ˆ๋‹ค. ์‹œ์Šคํ…œ ํ…Œ์ด๋ธ”์€ /etc/crontab์— ์žˆ๊ณ , ํŒจํ‚ค์ง€๋Š” ํ•ด๋‹น ํ…Œ์ด๋ธ”์„ /etc/cron.d์—, ์‚ฌ์šฉ์ž ํ…Œ์ด๋ธ”์€ /var/spool/cron/crontabs์— ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐ๋ชฌ์€ ์‹œ์Šคํ…œ ์ œ์–ด ํ•˜์— ์‹คํ–‰๋˜๋ฉฐ ์„œ๋น„์Šค ๊ตฌ์„ฑ์€ /lib/systemd/system/crond.service์ž…๋‹ˆ๋‹ค.

Red Hat๊ณผ ์œ ์‚ฌํ•œ ๋ฐฐํฌํŒ์—์„œ๋Š” ์‹œ์ž‘ ์‹œ ๊ธฐ๋ณธ์ ์œผ๋กœ ํ‘œ์ค€ bash์ธ /bin/sh๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. /bin/sh๋ฅผ ํ†ตํ•ด cron ์ž‘์—…์„ ์‹คํ–‰ํ•  ๋•Œ bash ์‰˜์€ POSIX ํ˜ธํ™˜ ๋ชจ๋“œ์—์„œ ์‹œ์ž‘๋˜๊ณ  ๋น„๋Œ€ํ™”ํ˜• ๋ชจ๋“œ์—์„œ ์‹คํ–‰๋˜๋Š” ์ถ”๊ฐ€ ๊ตฌ์„ฑ์„ ์ฝ์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์— ์œ ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

SLES ๋ฐ openSUSE์˜ ํฌ๋กœ๋‹ˆ

๋…์ผ ๋ฐฐํฌํŒ SLES์™€ ๊ทธ ํŒŒ์ƒ openSUSE๋Š” ๋™์ผํ•œ ํฌ๋กœ๋‹ˆ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์˜ ๋ฐ๋ชฌ์€ systemd์—์„œ๋„ ์‹œ์ž‘๋˜๋ฉฐ ์„œ๋น„์Šค ๊ตฌ์„ฑ์€ /usr/lib/systemd/system/cron.service์— ์žˆ์Šต๋‹ˆ๋‹ค. ๊ตฌ์„ฑ: /etc/crontab, /etc/cron.d, /var/spool/cron/tabs. /bin/sh๋Š” POSIX ํ˜ธํ™˜ ๋น„๋Œ€ํ™”ํ˜• ๋ชจ๋“œ์—์„œ ์‹คํ–‰๋˜๋Š” ๋™์ผํ•œ bash์ž…๋‹ˆ๋‹ค.

Vixie ํฌ๋ก  ์žฅ์น˜

ํ˜„๋Œ€ cron์˜ ํ›„์†์€ Vixie cron์— ๋น„ํ•ด ๊ทผ๋ณธ์ ์œผ๋กœ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜์ง€๋งŒ ํ”„๋กœ๊ทธ๋žจ์˜ ์›๋ฆฌ๋ฅผ ์ดํ•ดํ•˜๋Š” ๋ฐ ํ•„์š”ํ•˜์ง€ ์•Š์€ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์—ฌ์ „ํžˆ ํš๋“ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํ™•์žฅ ์ค‘ ๋‹ค์ˆ˜๋Š” ์ œ๋Œ€๋กœ ์„ค๊ณ„๋˜์ง€ ์•Š์•˜์œผ๋ฉฐ ์ฝ”๋“œ๋ฅผ ํ˜ผ๋ž€์Šค๋Ÿฝ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. Paul Vixey๊ฐ€ ์ž‘์„ฑํ•œ ์›๋ณธ cron ์†Œ์Šค ์ฝ”๋“œ๋Š” ์ฝ๊ธฐ์— ์ข‹์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์ €๋Š” ๋‘ ๊ฐœ๋ฐœ ๋ถ„๊ธฐ ๋ชจ๋‘์— ๊ณตํ†ต์ ์ธ cron ํ”„๋กœ๊ทธ๋žจ์ธ Vixie cron 3.0pl1์˜ ์˜ˆ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ cron ์žฅ์น˜๋ฅผ ๋ถ„์„ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ฝ๊ธฐ๋ฅผ ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ifdef๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ์‚ฌ์†Œํ•œ ์„ธ๋ถ€ ์‚ฌํ•ญ์„ ์ƒ๋žตํ•˜์—ฌ ์˜ˆ์ œ๋ฅผ ๋‹จ์ˆœํ™”ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์•…๋งˆ์˜ ํ™œ๋™์€ ์—ฌ๋Ÿฌ ๋‹จ๊ณ„๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ํ”„๋กœ๊ทธ๋žจ ์ดˆ๊ธฐํ™”.
  2. ์‹คํ–‰ํ•  ์ž‘์—… ๋ชฉ๋ก์„ ์ˆ˜์ง‘ํ•˜๊ณ  ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.
  3. ๊ธฐ๋ณธ ํฌ๋ก  ๋ฃจํ”„๊ฐ€ ์‹คํ–‰ ์ค‘์ž…๋‹ˆ๋‹ค.
  4. ์ž‘์—…์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

์ˆœ์„œ๋Œ€๋กœ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ดˆ๊ธฐํ™”

์‹œ์ž‘๋˜๋ฉด cron์€ ํ”„๋กœ์„ธ์Šค ์ธ์ˆ˜๋ฅผ ํ™•์ธํ•œ ํ›„ SIGCHLD ๋ฐ SIGHUP ์‹ ํ˜ธ ์ฒ˜๋ฆฌ๊ธฐ๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ๋Š” ํ•˜์œ„ ํ”„๋กœ์„ธ์Šค ์ข…๋ฃŒ์— ๋Œ€ํ•œ ๋กœ๊ทธ ํ•ญ๋ชฉ์„ ๋งŒ๋“ค๊ณ , ๋‘ ๋ฒˆ์งธ๋Š” ๋กœ๊ทธ ํŒŒ์ผ์˜ ํŒŒ์ผ ์„ค๋ช…์ž๋ฅผ ๋‹ซ์Šต๋‹ˆ๋‹ค.

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

cron ๋ฐ๋ชฌ์€ ํ•ญ์ƒ ์‹œ์Šคํ…œ์—์„œ ๋‹จ๋…์œผ๋กœ ์‹คํ–‰๋˜๋ฉฐ, ์ˆ˜ํผ์œ ์ €์™€ ๊ธฐ๋ณธ cron ๋””๋ ‰ํ„ฐ๋ฆฌ์—์„œ๋งŒ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ํ˜ธ์ถœ์€ ๋ฐ๋ชฌ ํ”„๋กœ์„ธ์Šค์˜ PID๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž ๊ธˆ ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ณ  ์‚ฌ์šฉ์ž๊ฐ€ ์˜ฌ๋ฐ”๋ฅธ์ง€ ํ™•์ธํ•˜๊ณ  ํ˜„์žฌ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ๊ธฐ๋ณธ ๋””๋ ‰ํ„ฐ๋ฆฌ๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

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

ํ”„๋กœ์„ธ์Šค๋ฅผ ์‹œ์ž‘ํ•  ๋•Œ ์‚ฌ์šฉ๋˜๋Š” ๊ธฐ๋ณธ ๊ฒฝ๋กœ๊ฐ€ ์„ค์ •๋ฉ๋‹ˆ๋‹ค.

setenv("PATH", _PATH_DEFPATH, 1);

๊ทธ๋Ÿฐ ๋‹ค์Œ ํ”„๋กœ์„ธ์Šค๋Š” "๋ฐ๋ชฌํ™”"๋ฉ๋‹ˆ๋‹ค. ์ฆ‰, ํ•˜์œ„ ํ”„๋กœ์„ธ์Šค(setid ํ˜ธ์ถœ)์—์„œ ๋ถ„๊ธฐ ๋ฐ ์ƒˆ ์„ธ์…˜์„ ํ˜ธ์ถœํ•˜์—ฌ ํ”„๋กœ์„ธ์Šค์˜ ํ•˜์œ„ ๋ณต์‚ฌ๋ณธ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ƒ์œ„ ํ”„๋กœ์„ธ์Šค๋Š” ๋” ์ด์ƒ ํ•„์š”ํ•˜์ง€ ์•Š์œผ๋ฉฐ ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค.

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 ํ•จ์ˆ˜ ํ˜ธ์ถœ์€ ํ…Œ์ด๋ธ” ํŒŒ์ผ ์ด๋ฆ„๊ณผ ์ผ์น˜ํ•˜๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€(์ˆ˜ํผ์œ ์ €๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ) ํ™•์ธํ•œ ๋‹ค์Œ load_user๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ํ›„์ž๋Š” ์ด๋ฏธ ํŒŒ์ผ ์ž์ฒด๋ฅผ ํ•œ ์ค„์”ฉ ์ฝ์Šต๋‹ˆ๋‹ค.

while ((status = load_env(envstr, file)) >= OK) {
    switch (status) {
    case ERR:
        free_user(u);
        u = NULL;
        goto done;
    case FALSE:
        e = load_entry(file, NULL, pw, envp);
        if (e) {
            e->next = u->crontab;
            u->crontab = e;
        }
        break;
    case TRUE:
        envp = env_set(envp, envstr);
        break;
    }
}

์—ฌ๊ธฐ์„œ๋Š” load_env / env_set ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•˜๊ฑฐ๋‚˜(VAR=value ํ˜•์‹์˜ ์ค„) load_entry ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘์—… ์„ค๋ช…์„ ์ฝ์Šต๋‹ˆ๋‹ค(* * * * * /path/to/exec).

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์˜ ์›๋ž˜ cron์€ ๋งค์šฐ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฃจํ”„์—์„œ ๊ตฌ์„ฑ์„ ๋‹ค์‹œ ์ฝ๊ณ , ํ˜„์žฌ ๋ถ„์˜ ์ž‘์—…์„ ์ˆ˜ํผ์œ ์ €๋กœ ์‹œ์ž‘ํ•˜๊ณ , ๋‹ค์Œ ๋ถ„์ด ์‹œ์ž‘๋  ๋•Œ๊นŒ์ง€ ์ž ์ž๊ธฐ ์ƒํƒœ์˜€์Šต๋‹ˆ๋‹ค. ์˜ค๋ž˜๋œ ์‹œ์Šคํ…œ์— ๋Œ€ํ•œ ์ด ๊ฐ„๋‹จํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์—๋Š” ๋„ˆ๋ฌด ๋งŽ์€ ๋ฆฌ์†Œ์Šค๊ฐ€ ํ•„์š”ํ–ˆ์Šต๋‹ˆ๋‹ค.

SysV์—์„œ๋Š” ๋ฐ๋ชฌ์ด ์ž‘์—…์ด ์ •์˜๋œ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๋ถ„๊นŒ์ง€ ๋˜๋Š” 30๋ถ„ ๋™์•ˆ ์ ˆ์ „ ๋ชจ๋“œ๋กœ ์ „ํ™˜๋˜๋Š” ๋Œ€์ฒด ๋ฒ„์ „์ด ์ œ์•ˆ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ชจ๋“œ์—์„œ๋Š” ๊ตฌ์„ฑ์„ ๋‹ค์‹œ ์ฝ๊ณ  ์ž‘์—…์„ ํ™•์ธํ•˜๋Š” ๋ฐ ์†Œ๋น„๋˜๋Š” ๋ฆฌ์†Œ์Šค๊ฐ€ ์ ์—ˆ์ง€๋งŒ ์ž‘์—… ๋ชฉ๋ก์„ ๋น ๋ฅด๊ฒŒ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๊ฒƒ์ด ๋ถˆํŽธํ–ˆ์Šต๋‹ˆ๋‹ค.

Vixie cron์€ 80๋ถ„์— ํ•œ ๋ฒˆ์”ฉ ์ž‘์—… ๋ชฉ๋ก์„ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ๋Œ์•„์™”์Šต๋‹ˆ๋‹ค. ๋‹คํ–‰์Šค๋Ÿฝ๊ฒŒ๋„ XNUMX๋…„๋Œ€ ๋ง์—๋Š” ํ‘œ์ค€ Unix ์‹œ์Šคํ…œ์— ํ›จ์”ฌ ๋” ๋งŽ์€ ๋ฆฌ์†Œ์Šค๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

/* ะฟะตั€ะฒะธั‡ะฝะฐั ะทะฐะณั€ัƒะทะบะฐ ะทะฐะดะฐั‡ */
load_database(&database);
/* ะทะฐะฟัƒัั‚ะธั‚ัŒ ะทะฐะดะฐั‡ะธ, ะฟะพัั‚ะฐะฒะปะตะฝะฝั‹ะต ะบ ะฒั‹ะฟะพะปะฝะตะฝะธัŽ ะฟะพัะปะต ะฟะตั€ะตะทะฐะณั€ัƒะทะบะธ ัะธัั‚ะตะผั‹ */
run_reboot_jobs(&database);
/* ัะดะตะปะฐั‚ัŒ TargetTime ะฝะฐั‡ะฐะปะพะผ ะฑะปะธะถะฐะนัˆะตะน ะผะธะฝัƒั‚ั‹ */
cron_sync();
while (TRUE) {
    /* ะฒั‹ะฟะพะปะฝะธั‚ัŒ ะทะฐะดะฐั‡ะธ, ะฟะพัะปะต ั‡ะตะณะพ ัะฟะฐั‚ัŒ ะดะพ TargetTime ั ะฟะพะฟั€ะฐะฒะบะพะน ะฝะฐ ะฒั€ะตะผั, ะฟะพั‚ั€ะฐั‡ะตะฝะฝะพะต ะฝะฐ ะทะฐะดะฐั‡ะธ */
    cron_sleep();

    /* ะฟะตั€ะตั‡ะธั‚ะฐั‚ัŒ ะบะพะฝั„ะธะณัƒั€ะฐั†ะธัŽ */
    load_database(&database);

    /* ัะพะฑั€ะฐั‚ัŒ ะทะฐะดะฐั‡ะธ ะดะปั ะดะฐะฝะฝะพะน ะผะธะฝัƒั‚ั‹ */
    cron_tick(&database);

    /* ะฟะตั€ะตะฒะตัั‚ะธ TargetTime ะฝะฐ ะฝะฐั‡ะฐะปะพ ัะปะตะดัƒัŽั‰ะตะน ะผะธะฝัƒั‚ั‹ */
    TargetTime += 60;
}

cron_sleep ํ•จ์ˆ˜๋Š” job_runqueue(์ž‘์—… ์—ด๊ฑฐ ๋ฐ ์‹คํ–‰) ๋ฐ do_command(๊ฐ ๊ฐœ๋ณ„ ์ž‘์—… ์‹คํ–‰) ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ž‘์—… ์‹คํ–‰์— ์ง์ ‘ ๊ด€์—ฌํ•ฉ๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰ ๊ธฐ๋Šฅ์„ ๋” ์ž์„ธํžˆ ์‚ดํŽด๋ณผ ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ž‘์—… ์‹คํ–‰

do_command ํ•จ์ˆ˜๋Š” ์ข‹์€ Unix ์Šคํƒ€์ผ๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ์ฆ‰, ์ž‘์—…์„ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ํฌํฌ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ƒ์œ„ ํ”„๋กœ์„ธ์Šค๋Š” ๊ณ„์†ํ•ด์„œ ์ž‘์—…์„ ์‹œ์ž‘ํ•˜๊ณ  ํ•˜์œ„ ํ”„๋กœ์„ธ์Šค๋Š” ์ž‘์—… ํ”„๋กœ์„ธ์Šค๋ฅผ ์ค€๋น„ํ•ฉ๋‹ˆ๋‹ค.

switch (fork()) {
case -1:
    /*ะฝะต ัะผะพะณะปะธ ะฒั‹ะฟะพะปะฝะธั‚ัŒ fork */
    break;
case 0:
    /* ะดะพั‡ะตั€ะฝะธะน ะฟั€ะพั†ะตัั: ะฝะฐ ะฒััะบะธะน ัะปัƒั‡ะฐะน ะตั‰ะต ั€ะฐะท ะฟั€ะพะฑัƒะตะผ ะทะฐั…ะฒะฐั‚ะธั‚ัŒ ะณะปะฐะฒะฝั‹ะน ะปะพะบ */
    acquire_daemonlock(1);
    /* ะฟะตั€ะตั…ะพะดะธะผ ะบ ั„ะพั€ะผะธั€ะพะฒะฐะฝะธัŽ ะฟั€ะพั†ะตััะฐ ะทะฐะดะฐั‡ะธ */
    child_process(e, u);
    /* ะฟะพ ะทะฐะฒะตั€ัˆะตะฝะธัŽ ะดะพั‡ะตั€ะฝะธะน ะฟั€ะพั†ะตัั ะทะฐะบะฐะฝั‡ะธะฒะฐะตั‚ ั€ะฐะฑะพั‚ัƒ */
    _exit(OK_EXIT);
    break;
default:
    /* ั€ะพะดะธั‚ะตะปัŒัะบะธะน ะฟั€ะพั†ะตัั ะฟั€ะพะดะพะปะถะฐะตั‚ ั€ะฐะฑะพั‚ัƒ */
    break;
}

child_process์—๋Š” ๊ฝค ๋งŽ์€ ๋…ผ๋ฆฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํ‘œ์ค€ ์ถœ๋ ฅ ๋ฐ ์˜ค๋ฅ˜ ์ŠคํŠธ๋ฆผ์„ ์ž์ฒด์ ์œผ๋กœ ๋ฐ›์•„ ๋ฉ”์ผ๋กœ ๋ณด๋‚ด๊ณ (MAILTO ํ™˜๊ฒฝ ๋ณ€์ˆ˜๊ฐ€ ์ž‘์—… ํ…Œ์ด๋ธ”์— ์ง€์ •๋œ ๊ฒฝ์šฐ) ๋งˆ์ง€๋ง‰์œผ๋กœ ๊ธฐ๋ณธ ๋ฉ”์‹œ์ง€๋ฅผ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค. ์ž‘์—…์„ ์™„๋ฃŒํ•˜๋Š” ๊ณผ์ •์ž…๋‹ˆ๋‹ค.

์ž‘์—… ํ”„๋กœ์„ธ์Šค๋Š” ๋˜ ๋‹ค๋ฅธ ํฌํฌ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.

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์€ Unix ์„ธ๊ณ„ ์ตœ๊ณ ์˜ ์ „ํ†ต์„ ๋ฐ”ํƒ•์œผ๋กœ ๋งŒ๋“ค์–ด์ง„ ๋†€๋ž๋„๋ก ๊ฐ„๋‹จํ•˜๊ณ  ์œ ์šฉํ•œ ํ”„๋กœ๊ทธ๋žจ์ž…๋‹ˆ๋‹ค. ๊ทธ๋…€๋Š” ์ถ”๊ฐ€๋กœ ํ•˜๋Š” ์ผ์ด ์—†์ง€๋งŒ ์ง€๊ธˆ๊นŒ์ง€ ์ˆ˜์‹ญ ๋…„ ๋™์•ˆ ์ž์‹ ์˜ ์ผ์„ ํ›Œ๋ฅญํ•˜๊ฒŒ ํ•ด์™”์Šต๋‹ˆ๋‹ค. Ubuntu์™€ ํ•จ๊ป˜ ์ œ๊ณต๋˜๋Š” ๋ฒ„์ „์˜ ์ฝ”๋“œ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ๋Š” ํ•œ ์‹œ๊ฐ„๋„ ์ฑ„ ๊ฑธ๋ฆฌ์ง€ ์•Š์•˜๊ณ  ์ •๋ง ์ฆ๊ฑฐ์› ์Šต๋‹ˆ๋‹ค! ์—ฌ๋Ÿฌ๋ถ„๊ณผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์—ˆ์œผ๋ฉด ์ข‹๊ฒ ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋‹น์‹ ์— ๋Œ€ํ•ด ๋ชจ๋ฅด์ง€๋งŒ, ์ง€๋‚˜์น˜๊ฒŒ ๋ณต์žกํ•˜๊ณ  ์ง€๋‚˜์น˜๊ฒŒ ์ถ”์ƒ์ ์ธ ๊ฒฝํ–ฅ์ด ์žˆ๋Š” ํ˜„๋Œ€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด ์˜ค๋žซ๋™์•ˆ ๊ทธ๋Ÿฌํ•œ ๋‹จ์ˆœ์„ฑ์— ๋„์›€์ด ๋˜์ง€ ์•Š์•˜๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ซ๊ณ  ์กฐ๊ธˆ ์Šฌํ”„๋‹ค.

cron์— ๋Œ€ํ•œ ํ˜„๋Œ€์ ์ธ ๋Œ€์•ˆ์ด ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค. systemd-timers๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ข…์†์„ฑ์ด ์žˆ๋Š” ๋ณต์žกํ•œ ์‹œ์Šคํ…œ์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๊ณ , fcron์„ ์‚ฌ์šฉํ•˜๋ฉด ์ž‘์—…๋ณ„๋กœ ๋ฆฌ์†Œ์Šค ์†Œ๋น„๋ฅผ ๋ณด๋‹ค ์œ ์—ฐํ•˜๊ฒŒ ์กฐ์ ˆํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ฐœ์ธ์ ์œผ๋กœ ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ crontab์ด๋ฉด ํ•ญ์ƒ ์ถฉ๋ถ„ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ฆ‰, Unix๋ฅผ ์‚ฌ๋ž‘ํ•˜๊ณ  ๊ฐ„๋‹จํ•œ ํ”„๋กœ๊ทธ๋žจ์„ ์‚ฌ์šฉํ•˜๋ฉฐ ํ”Œ๋žซํผ์˜ ๋งˆ๋‚˜๋ฅผ ์ฝ๋Š” ๊ฒƒ์„ ์žŠ์ง€ ๋งˆ์‹ญ์‹œ์˜ค!

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€