Study: ComputerScience(CS)/CS: Linux

[Linux] ๋ฆฌ๋ˆ…์Šค ํฌ๋ก ํƒญ(Linux Crontab) ์‚ฌ์šฉ๋ฒ•: ์ž‘์—… ์Šค์ผ€์ค„๋Ÿฌ

DrawingProcess 2022. 12. 14. 16:17
๋ฐ˜์‘ํ˜•
๐Ÿ’ก ๋ณธ ๋ฌธ์„œ๋Š” '๋ฆฌ๋ˆ…์Šค ํฌ๋ก ํƒญ(Linux Crontab) ์‚ฌ์šฉ๋ฒ•: ์ž‘์—… ์Šค์ผ€์ค„๋Ÿฌ'์— ๋Œ€ํ•ด ์ •๋ฆฌํ•ด๋†“์€ ๊ธ€์ž…๋‹ˆ๋‹ค.
์œˆ๋„์šฐ์—์„œ๋Š” ์Šค์ผ€์ค„๋Ÿฌ์™€ ๋น„์Šทํ•˜๊ฒŒ ๋ฆฌ๋ˆ…์Šค์—์„œ๋„ ํŠน์ • ์‹œ๊ฐ„์— ํŠน์ • ์ž‘์—…์„ ํ•ด์•ผํ•œ๋‹ค๋ฉด ํฌ๋ก ํƒญ(Crontab)์„ ์„ค์ •ํ•˜์—ฌ ์‚ฌ์šฉํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์ด์— ๋Œ€ํ•ด ์ •๋ฆฌํ•˜์˜€์œผ๋‹ˆ ์ฐธ๊ณ ํ•˜์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.

1. ํฌ๋ก ํƒญ ๊ธฐ๋ณธ (crontab basic)

1.1 ํฌ๋ก ํƒญ์ด๋ž€?

crontab์ด๋ž€? ๋ฆฌ๋ˆ…์Šค์—์„œ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ crons ๋ฐ๋ชฌ์ด ์ฃผ๊ธฐ์ ์ธ ์ž‘์—… ์‹คํ–‰์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. cron์ด ์‹œ์ž‘๋  ๋•Œ๋ถ€ํ„ฐ ๋๋‚  ๋•Œ๊นŒ์ง€ ์‹คํ–‰๋˜๋ฉฐ cron ์„ค์ • ํŒŒ์ผ์€ cron table์„ ์ค„์—ฌ์„œ crontab์ด๋ผ ๋ถ€๋ฅด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

1.2 ํฌ๋ก ํƒญ ๊ธฐ๋ณธ ์‚ฌ์šฉ

์ผ๋‹จ ๊ธฐ๋ณธ์ด ๋˜๋Š” ํฌ๋ก ํƒญ ์‚ฌ์šฉ๋ฒ•์„ ํ•œ ๋ฒˆ ๋ณผ๊นŒ์š”. ๋ฆฌ๋ˆ…์Šค ์‰˜์—์„œ ๋‹ค์Œ์ฒ˜๋Ÿผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.

$ crontab -e

๊ทธ๋Ÿฌ๋ฉด ํฌ๋ก ํƒญ์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๊ณณ์ด ๋กœ๋”ฉ๋˜๋ฉฐ, ๊ฐ์ข… ํฌ๋ก ํƒญ ๋ช…๋ น์–ด์— ๋Œ€ํ•ด์„œ๋Š” ํ•˜๋‹จ์—์„œ ์ž์„ธํžˆ ์–ธ๊ธ‰ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์ž…๋ ฅํ•œ ํ›„ :wq ๋ฅผ ์ž…๋ ฅํ•˜์—ฌ ์ข…๋ฃŒ์‹œํ‚ค๋ฉด ํฌ๋ก ํƒญ์„ ๊ฐฑ์‹ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐ˜๋Œ€๋กœ ํ˜„์žฌ ํฌ๋ก ํƒญ์— ์–ด๋–ค ๋‚ด์šฉ์ด ๋“ค์–ด์žˆ๋Š”์ง€ ๋ณด๋ ค๋ฉด ๋‹ค์Œ์ฒ˜๋Ÿผ ์ž…๋ ฅํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

$ crontab -l

๊ทธ๋Ÿฌ๋ฉด cat ๋ช…๋ น์–ด๋กœ ํŒŒ์ผ์„ ์ฝ์–ด๋“ค์ธ ๊ฒƒ์ฒ˜๋Ÿผ ํ‘œ์ค€ ์ถœ๋ ฅ์œผ๋กœ ํฌ๋ก ํƒญ ๋‚ด์šฉ์ด ๋‚˜์˜ค๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๋งŒ์•ฝ(๊ฑฐ์˜ ์—†๊ฒ ์ง€๋งŒ) ํฌ๋ก ํƒญ์„ ์ง€์šฐ๊ณ  ์‹ถ๋‹ค๋ฉด? ๋ฆฌ๋ˆ…์Šค ์‰˜์— ๋‹ค์Œ์ฒ˜๋Ÿผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.

$ crontab -r

์ด๋ ‡๊ฒŒ๊นŒ์ง€ ํ•˜๋ฉด ํฌ๋ก ํƒญ์˜ ๊ธฐ๋ณธ ์„ค์ • ๋ฐ ํ™•์ธ, ์‚ญ์ œ์— ๋Œ€ํ•ด ๋ฐฐ์šด ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์‹ค์ œ๋กœ ํฌ๋ก ํƒญ์— ํฌ๋ก  ํ•˜๋‚˜๋ฅผ ์˜ˆ์ œ๋กœ ๋“ฑ๋ก ํ•ด๋ด…์‹œ๋‹ค.

๋‹ค์Œ์ฒ˜๋Ÿผ crontab -e ์ž…๋ ฅ ํ›„ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‚ด์šฉ์„ ์ž…๋ ฅํ•ฉ์‹œ๋‹ค. ์ €์žฅ์€ vi ์ฒ˜๋Ÿผ ์ฝœ๋ก  (:) ์ž…๋ ฅ ํ›„ wq ๋กœ ๊ฐฑ์‹ ์‹œ์ผœ์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

* * * * * ls -al

๋ณ„์ด ๋‹ค์„ฏ๊ฐœ๋‚˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋’ค์—๋Š” ๋ช…๋ น์–ด๊ฐ€ ์ ํ˜€ ์žˆ๋„ค์š”. ์ด๊ฒŒ ๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์‰˜์Šคํฌ๋ฆฝํŠธ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋ฆฌ๋ˆ…์Šค ์ปค๋งจ๋“œ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.์—ฌ๊ธฐ์„œ๋Š” ์‰˜์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ์„ค๋ช…ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋ณ„์ด ๋‹ค์„ฏ๊ฐœ ์žˆ๋Š” ๊ฒฝ์šฐ์—” "๋งค๋ถ„๋งˆ๋‹ค ์‹คํ–‰" ํ•˜๋Š”๊ฒ๋‹ˆ๋‹ค. ์ด์ œ ๋ณ„์ด ์ง€์นญํ•˜๋Š” ๊ฒƒ์ด ๋ฌด์—‡์ธ์ง€ ์ž์„ธํžˆ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

2. ์ฃผ๊ธฐ ๊ฒฐ์ •

*ใ€€ใ€€ใ€€ใ€€ใ€€ใ€€*ใ€€ใ€€ใ€€ใ€€ใ€€ใ€€*ใ€€ใ€€ใ€€ใ€€ใ€€ใ€€*ใ€€ใ€€ใ€€ใ€€ใ€€ใ€€*
๋ถ„(0-59)ใ€€ใ€€์‹œ๊ฐ„(0-23)ใ€€ใ€€์ผ(1-31)ใ€€ใ€€์›”(1-12)ใ€€ใ€€ใ€€์š”์ผ(0-7)

๊ฐ ๋ณ„ ์œ„์น˜์— ๋”ฐ๋ผ ์ฃผ๊ธฐ๋ฅผ ๋‹ค๋ฅด๊ฒŒ ์„ค์ • ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ˆœ์„œ๋Œ€๋กœ ๋ถ„-์‹œ๊ฐ„-์ผ-์›”-์š”์ผ ์ˆœ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ด„ํ˜ธ ์•ˆ์˜ ์ˆซ์ž ๋ฒ”์œ„ ๋‚ด๋กœ ๋ณ„ ๋Œ€์‹  ์ž…๋ ฅ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์š”์ผ์—์„œ 0๊ณผ 7์€ ์ผ์š”์ผ์ž…๋‹ˆ๋‹ค. 1๋ถ€ํ„ฐ ์›”์š”์ผ์ด๊ณ  6์ด ํ† ์š”์ผ์ž…๋‹ˆ๋‹ค.

3. ์ฃผ๊ธฐ๋ณ„ ์˜ˆ์ œ

3.1. ๋งค๋ถ„ ์‹คํ–‰

# ๋งค๋ถ„ test.sh ์‹คํ–‰
* * * * * /home/script/test.sh

3.2. ํŠน์ • ์‹œ๊ฐ„ ์‹คํ–‰

# ๋งค์ฃผ ๊ธˆ์š”์ผ ์˜ค์ „ 5์‹œ 45๋ถ„์— test.sh ๋ฅผ ์‹คํ–‰
45 5 * * 5 /home/script/test.sh

3.3. ๋ฐ˜๋ณต ์‹คํ–‰

# ๋งค์ผ ๋งค์‹œ๊ฐ„ 0๋ถ„, 20๋ถ„, 40๋ถ„์— test.sh ๋ฅผ ์‹คํ–‰
0,20,40 * * * * /home/script/test.sh

3.4. ๋ฒ”์œ„ ์‹คํ–‰

# ๋งค์ผ 1์‹œ 0๋ถ„๋ถ€ํ„ฐ 30๋ถ„๊นŒ์ง€ ๋งค๋ถ„ tesh.sh ๋ฅผ ์‹คํ–‰
0-30 1 * * * /home/script/test.sh

3.5. ๊ฐ„๊ฒฉ ์‹คํ–‰

# ๋งค 10๋ถ„๋งˆ๋‹ค test.sh ๋ฅผ ์‹คํ–‰
*/10 * * * * /home/script/test.sh

3.6. ์กฐ๊ธˆ ๋ณต์žกํ•˜๊ฒŒ ์‹คํ–‰

# 5์ผ์—์„œ 6์ผ๊นŒ์ง€ 2์‹œ,3์‹œ,4์‹œ์— ๋งค 10๋ถ„๋งˆ๋‹ค test.sh ๋ฅผ ์‹คํ–‰
*/10 2,3,4 5-6 * * /home/script/test.sh

 ์ฃผ๊ธฐ ์ž…๋ ฅ ๋ฐฉ๋ฒ•์—” * , - / ์„ ์ด์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์œ„์—์„œ ๋ณด์…จ๋“ฏ์ด ๊ฐ๊ฐ์˜ ํŠน์ˆ˜๊ธฐํ˜ธ๊ฐ€ ํ•˜๋Š” ๊ธฐ๋Šฅ์ด ๋‹ค๋ฅด๊ณ  ์กฐํ•ฉ์„ ์–ด๋–ป๊ฒŒ ํ•˜๋Š๋ƒ์— ๋”ฐ๋ผ ์ž…๋ง›๋Œ€๋กœ ์ฃผ๊ธฐ๋ฅผ ์„ค์ • ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

+ ๋งค์ดˆ ์‹คํ–‰

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

# original.
task;

# 2 seconds interval.
for i in {1..30}; do
    task;
    sleep 2;
done

๊ทธ ๋‹ค์Œ crontab์— 1๋ถ„ ์Šค์ผ€์ค„๋ง์„ ๊ฑธ์–ด์ค๋‹ˆ๋‹ค.

# crontab
* * * * * /bin/sh /path/to/script.sh

sleep ์‹œ๊ฐ„์„ ๋™์ ์œผ๋กœ ์„ค์ •ํ•˜๋ ค๋ฉด sleep ์‹œ๊ฐ„์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋„๋ก ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

n=$1
# n seconds interval.
for i in $(seq $((60/$n))); do
    task;
    sleep $n;
done
# crontab
* * * * * /bin/sh /path/to/script.sh 2

๊ทธ๋Ÿฐ๋ฐ ๋งŒ์•ฝ task ์‹คํ–‰ ์‹œ๊ฐ„์ด ์ถฉ๋ถ„ํžˆ ์งง์ง€ ์•Š๋‹ค๋ฉด ์‹ค์งˆ์ ์ธ sleep ์‹œ๊ฐ„์€ task ์‹คํ–‰์‹œ๊ฐ„ + sleep ์‹œ๊ฐ„์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์Šค์ผ€์ค„๋ง์— ์˜ค์ฐจ๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ๋‹ค. ์ด ๊ฒฝ์šฐ๋Š” task๋ฅผ ๋ฐฑ๊ทธ๋ผ์šด๋“œ๋กœ ์‹คํ–‰ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

n=$1
# n seconds interval.
for i in $(seq $((60/$n))); do
    task &;
    sleep $n;
done

 

4. ํฌ๋ก  ์‚ฌ์šฉ ํŒ

4.1. ํ•œ ์ค„์— ํ•˜๋‚˜์˜ ๋ช…๋ น๋งŒ ์”์‹œ๋‹ค.

# ์ž˜๋ชป๋œ ์˜ˆ
* * * 5 5
/home/script/test.sh
# ์ž˜๋œ ์˜ˆ
* * * 5 5 /home/script/test.sh

4.2. ์ฃผ์„์„ ๋‹ฌ์•„๋ด…์‹œ๋‹ค.

# ์ฃผ์„ #
#--------------------#
# ์ด๊ฒƒ์€ ์ฃผ์„์ž…๋‹ˆ๋‹ค. #
#--------------------#

# ์„ ์ž…๋ ฅํ•ด์„œ ๊ทธ ๋’ค๋กœ ๋‚˜์˜ค๋Š” ๋ชจ๋“  ๋ฌธ์ž๋ฅผ ์ฃผ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

5. ํฌ๋ก  ๋กœ๊น… (cron logging)

ํฌ๋ก ํƒญ์„ ์‚ฌ์šฉํ•ด์„œ ์ •๊ธฐ์ ์œผ๋กœ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์€ ์ข‹์€๋ฐ, ํ•ด๋‹น ์ฒ˜๋ฆฌ ๋‚ด์—ญ์— ๋Œ€ํ•ด ๋กœ๊ทธ๋ฅผ ๋‚จ๊ธฐ๊ณ  ์‹ถ์„ ๋•Œ๊ฐ€ ์žˆ์„๊ฒ๋‹ˆ๋‹ค. ๊ทธ๋Ÿด๋•Œ ๋‹ค์Œ์ฒ˜๋Ÿผ ํ•œ๋ฒˆ ์จ๋ด…์‹œ๋‹ค.

* * * * * /home/script/test.sh > /home/script/test.sh.log 2>&1

 

์œ„์ฒ˜๋Ÿผ ์ž‘์„ฑํ•˜๋ฉด ๋งค๋ถ„๋งˆ๋‹ค test.sh.log ํŒŒ์ผ์ด ๊ฐฑ์‹  ๋˜์–ด ์ž‘์—… ๋‚ด์šฉ์ด ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌ ๋˜์—ˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งŒ์•ฝ 2>&1 ์„ ์ œ๊ฑฐํ•˜๋ฉด ์‰˜์Šคํฌ๋ฆฝํŠธ์—์„œ ํ‘œ์ค€ ์ถœ๋ ฅ ๋‚ด์šฉ๋งŒ ๋‚˜์˜ต๋‹ˆ๋‹ค. 2>&1์€ ์ด๊ณณ์—์„œ ํ™•์ธํ•ฉ์‹œ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ, ์ด๊ฒŒ ๋„ˆ๋ฌด ์ž์ฃผ ์‹คํ–‰ ๋˜๊ณ  ๋˜ํ•œ ์ง€์†์ ์œผ๋กœ ๋กœ๊น…์ด ๋˜์•ผ ํ•ด์„œ ๋กœ๊ทธ๋ฅผ ๊ณ„์† ๋‚จ๊ฒจ๋‘ฌ์•ผ ํ•œ๋‹ค๋ฉด ๋‹ค์Œ์ฒ˜๋Ÿผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.

* * * * * /home/script/test.sh >> /home/script/test.sh.log 2>&1

๊ทธ๋Ÿฌ๋ฉด ๊ณ„์† ๋กœ๊ทธ๊ฐ€ ๋ˆ„์ ์ด ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ์„๊ฒ๋‹ˆ๋‹ค. ๋Œ€์‹  ๋กœ๊ทธ๊ฐ€ ๊ณผ๋„ํ•˜๊ฒŒ ์Œ“์ด๋ฉด ๋ฆฌ๋ˆ…์Šค ํผํฌ๋จผ์Šค์— ์˜ํ–ฅ์„ ์ฃผ๋ฏ€๋กœ ๊ฐ€๋”์”ฉ ๋น„์›Œ์ฃผ๊ฑฐ๋‚˜ ํŒŒ์ผ์„ ์ƒˆ๋กœ ๋งŒ๋“ค์–ด์ฃผ๋Š” ์„ผ์Šค๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๋ฐ˜๋Œ€๋กœ ๋กœ๊ทธ๋Š” ํ•„์š” ์—†๋Š” ํฌ๋ก ์„ ์œ„ํ•ด์„  ๋‹ค์Œ์ฒ˜๋Ÿผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.

* * * * * /home/script/test.sh > /dev/null 2>&1

6. ํฌ๋ก ํƒญ ๋ฐฑ์—… (crontab backup)

์ž, ํ˜น์‹œ๋ผ๋„ crontab -r ๋ฅผ ์“ฐ๊ฑฐ๋‚˜ ์‹ค์ˆ˜๋กœ crontab ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๋‚ ๋ ค๋ฒ„๋ ค์„œ ๊ธฐ์กด ํฌ๋ก  ๋‚ด์—ญ๋“ค์ด ๋‚ ์•„๊ฐ”์„๋•Œ, ์ •๋ง ํ™ฉ๋งํ• ๊ฑฐ ๊ฐ™์€๋ฐ ๋ง์ด์ฃ . ๊ทธ๋Ÿฌ๋‹ˆ ์ฃผ๊ธฐ์ ์œผ๋กœ ํฌ๋ก ํƒญ์„ ๋ฐฑ์—…ํ•ด ๋‘ก์‹œ๋‹ค. ๋ฐฑ์—…์€ ๋‹ค์Œ์ฒ˜๋Ÿผ ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

crontab -l > /home/bak/crontab_bak.txt

ํฌ๋ก ํƒญ ๋‚ด์šฉ์„ txt ํŒŒ์ผ๋กœ ๋งŒ๋“ค์–ด ์ €์žฅํ•ด๋‘๋Š”๊ฒ๋‹ˆ๋‹ค. ์ž, ์ด๊ฒƒ๋„ ์ž๋™ํ™”๊ฐ€ ๋  ์ˆ˜ ์žˆ์„๊นŒ์š”?

50 23 * * * crontab -l > /home/bak/crontab_bak.txt

์ฒ˜๋Ÿผ ํ•˜๋ฉด ๋˜๊ฒ ์ฃ ? ๋งค์ผ ์˜คํ›„ 11์‹œ 50๋ถ„์— ํฌ๋ก ํƒญ์„ ๋ฐฑ์—…ํ•ด๋‘๋Š” ํฌ๋ก  ๋ช…๋ น์–ด์ž…๋‹ˆ๋‹ค. :)

 

์ฐธ๊ณ 

๋ฐ˜์‘ํ˜•