๐ก ๋ณธ ๋ฌธ์๋ '๋ฆฌ๋ ์ค ํฌ๋ก ํญ(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๋ถ์ ํฌ๋ก ํญ์ ๋ฐฑ์ ํด๋๋ ํฌ๋ก ๋ช ๋ น์ด์ ๋๋ค. :)
์ฐธ๊ณ
- [Blog] ๋ฆฌ๋ ์ค ํฌ๋ก ํญ(Linux Crontab) ์ฌ์ฉ๋ฒ: https://jdm.kr/blog/2
- [Blog] cron ์์ ์ด ๋จ์๋ก ์ค์ผ์ค๋งํ๊ธฐ: https://www.lesstif.com/lpt/cron-95879526.html