πŸ€ͺ μž¬λΆ€νŒ… μ‹œ Crontab에 μ˜ν•΄μ„œ ν”„λ‘œμ„ΈμŠ€κ°€ μžλ™μœΌλ‘œ μ‹€ν–‰λ˜μ§€ μ•Šμ€ 이유

크둠탭(Crontab)은 λ¦¬λˆ…μŠ€μ—μ„œ μΌμ •λœ μ‹œμ μ΄λ‚˜ 주기적으둜 λͺ…λ Ήμ–΄ λ˜λŠ” μ‰˜ 슀크립트λ₯Ό μ‹€ν–‰ν•  수 μžˆλŠ” μŠ€μΌ€μ€„λŸ¬ λ˜λŠ” νƒ€μ΄λ¨Έμž…λ‹ˆλ‹€. 이전에 μž‘μ„±ν•œ λ¦¬λˆ…μŠ€μ—μ„œ ν”„λ‘œμ„ΈμŠ€ μ‹€ν–‰ μœ μ§€ν•˜κΈ°μ—μ„œλ„ ν¬λ‘ νƒ­μœΌλ‘œ ν”„λ‘œμ„ΈμŠ€λ₯Ό μ‹€ν–‰ν•˜λŠ” 방법에 λŒ€ν•΄μ„œ 닀루어본 적이 μžˆμŠ΅λ‹ˆλ‹€. μ„œλ²„ μ‹œμŠ€ν…œμ΄ μ˜ˆκΈ°μ§€ μ•Šμ€ 상황에 μ˜ν•΄μ„œ μž¬λΆ€νŒ…λ˜κ±°λ‚˜ μ’…λ£Œλ˜μ–΄ μˆ˜λ™μœΌλ‘œ 싀행될 μˆ˜λ„ μžˆμœΌλ―€λ‘œ Systemd λ˜λŠ” Crontab으둜 ν”„λ‘œμ„ΈμŠ€λ₯Ό μžλ™μœΌλ‘œ μ‹€ν–‰ν•  수 μžˆλ‹€κ³  κ³΅μœ ν–ˆμ—ˆμŠ΅λ‹ˆλ‹€.

그런데 μ–Όλ§ˆμ „μ— νŠΉμ • 고객 ν™˜κ²½μ˜ μ„œλ²„λ“€μ„ 고객이 지진과 같은 예기치 μ•Šμ€ μž₯μ• λ‘œ μΈν•΄μ„œ μ„œλ²„κ°€ μž¬λΆ€νŒ…λ˜λŠ” μƒν™©μ—μ„œ ν”„λ‘œμ„ΈμŠ€κ°€ μžλ™μœΌλ‘œ 싀행될 수 μžˆμŒμ„ ν…ŒμŠ€νŠΈν•˜λ˜ 쀑 μ„œλ²„κ°€ μž¬λΆ€νŒ…λ  λ•Œ μžλ™μœΌλ‘œ μ‹€ν–‰λ˜μ—ˆμ–΄μ•Όν•  ν”„λ‘œμ„ΈμŠ€λ“€μ΄ μ‹œμž‘λ˜μ§€ μ•ŠλŠ”λ‹€λŠ” ν”Όλ“œλ°±μ΄ μ „λ‹¬λ˜μ—ˆμŠ΅λ‹ˆλ‹€. μ‹€μ œλ‘œ μ‹œμŠ€ν…œμ΄ μž¬λΆ€νŒ…λ  λ•Œ ν”„λ‘œμ„ΈμŠ€κ°€ μžλ™μœΌλ‘œ μ‹€ν–‰λ˜μ§€ μ•Šμ•˜μŒμ„ ν™•μΈν•˜μ˜€κ³  크둠탭과 μ‰˜ μŠ€ν¬λ¦½νŠΈμ— λŒ€ν•œ 이해가 λΆ€μ‘±ν–ˆλ‹€λŠ” 점을 ν™•μΈν–ˆμŠ΅λ‹ˆλ‹€.

μ €λŠ” μ„œλ²„μ— λŒ€ν•œ 뢀뢄을 μ „λ¬Έμ μœΌλ‘œ κ΄€λ¦¬ν•˜λŠ” μ„œλ²„ μ—”μ§€λ‹ˆμ–΄λŠ” μ•„λ‹ˆλ―€λ‘œ ν•„μš”ν•œ 뢀뢄을 κ²€μƒ‰ν•œ ν›„ μ •λ¦¬λœ λ°”λ₯Ό ν† λŒ€λ‘œ μž‘μ—…μ„ ν•  수 밖에 μ—†μŠ΅λ‹ˆλ‹€. Crontab에 μ˜ν•΄μ„œ ν”„λ‘œμ„ΈμŠ€κ°€ μžλ™μœΌλ‘œ μ‹€ν–‰λ˜κΈ° μœ„ν•΄μ„œ κ²€ν† ν•˜μ§€ μ•Šμ€ 뢀뢄이 무엇인지λ₯Ό κ³΅μœ ν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

Crontab

크둠탭에 λŒ€ν•œ 메뉴얼 νŽ˜μ΄μ§€λ₯Ό μ‚΄νŽ΄λ³΄λ©΄ EXTENSIONS으둜 μ‹œμŠ€ν…œμ΄ μž¬λΆ€νŒ…λ˜μ—ˆμ„λ•Œ μ‹€ν–‰ν•  수 μžˆλ„λ‘ μ‹œκ°„μ„ 지정할 수 μžˆλŠ” 별칭이 μžˆλ‹€λŠ” 것을 확인할 수 μžˆμŠ΅λ‹ˆλ‹€. Crontab Reboot: How to Execute a Job Automatically at Boot와 같은 κΈ€μ—μ„œλ„ κ°„λ‹¨ν•˜κ²Œ @reboot을 μ‚¬μš©ν•˜λ©΄ μ‹œμŠ€ν…œμ΄ λΆ€νŒ…λ˜μ—ˆμ„λ•Œ 슀크립트λ₯Ό μ‹€ν–‰ν•  수 μžˆλ‹€κ³  μ •λ¦¬λ˜μ–΄μžˆμŠ΅λ‹ˆλ‹€. κ·Έλž˜μ„œ λ‹¨μˆœνžˆ @rebootλ₯Ό μ§€μ •ν•˜κΈ°λ§Œ ν•˜λ©΄ μ‹œμŠ€ν…œμ΄ μž¬λΆ€νŒ…λ˜μ—ˆμ„λ•Œ μ •μƒμ μœΌλ‘œ μ‰˜ μŠ€ν¬λ¦½νŠΈκ°€ 싀행될 것이라고 μ˜ˆμƒν•˜μ˜€μŠ΅λ‹ˆλ‹€.

Interactive and Non-Interactive Shell

μ œκ°€ κ²€ν† ν•˜μ§€ μ•Šμ€ 뢀뢄은 μ‰˜ μŠ€ν¬λ¦½νŠΈκ°€ μ‹€ν–‰λ˜λŠ” 방식이 λ‹€μ–‘ν•˜λ‹€λŠ” 것에 μžˆμŠ΅λ‹ˆλ‹€. 일반적으둜 SSH μ ‘μ†μœΌλ‘œ μ‹€ν–‰λ˜λŠ” μ‰˜μ€ 둜그인 μ‰˜μž…λ‹ˆλ‹€. 둜그인 μ‰˜ 및 Bash둜 μ‹€ν–‰λ˜μ—ˆμ„λ•ŒλŠ” λ‹€μŒκ³Ό 같은 νŒŒμΌλ“€μ΄ μžλ™μœΌλ‘œ λ‘œλ“œλœλ‹€λŠ” νŠΉμ§•μ΄ μžˆμŠ΅λ‹ˆλ‹€.

  • /etc/profile
  • ~/.bash_profile
  • ~/.bashrc
  • ~/.profile

일반적으둜 μ‰˜ 슀크립트λ₯Ό μž‘μ„±ν•˜κ³  μ‹€ν–‰ν•΄λ³΄μ•˜μ„λ•ŒλŠ” 둜그인 μ‰˜μ„ 톡해 μ‹€ν–‰ν•˜κΈ° λ•Œλ¬Έμ— μ‹€ν–‰ μŠ€ν¬λ¦½νŠΈμ—μ„œ μ°Έμ‘°ν•˜λŠ” λ§Žμ€ ν™˜κ²½λ³€μˆ˜κ°€ μ˜¬λ°”λ₯΄κ²Œ μ§€μ •λ˜μ–΄μžˆλ‹€λŠ” 것이 보μž₯λ©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ Crontab에 μ˜ν•΄μ„œ μžλ™μœΌλ‘œ μ‹€ν–‰λ˜λŠ” μŠ€ν¬λ¦½νŠΈλŠ” 둜그인 μ‰˜μ—μ„œ μˆ˜ν–‰λ˜λŠ” 것이 μ•„λ‹ˆλ―€λ‘œ ν™˜κ²½λ³€μˆ˜κ°€ μ œλŒ€λ‘œ μ§€μ •λœλ‹€λŠ” 것을 보μž₯ν•  수 μ—†λŠ” 문제λ₯Ό κ°„κ³Όν•œ κ²ƒμž…λ‹ˆλ‹€.

μ‚¬μš©μž κΈ°λ³Έ μ‰˜

μ‰˜ μŠ€ν¬λ¦½νŠΈμ— μ…”λ±…(#!)을 Bash둜 μ§€μ •ν•˜λ”λΌλ„ 크둠탭에 μ˜ν•΄μ„œ μ‹€ν–‰λ˜λŠ” μ‰˜ μœ ν˜•μ€ μ‚¬μš©μžμ˜ κΈ°λ³Έ μ‰˜λ‘œ κ³ μ •λ©λ‹ˆλ‹€. SSH 접속 ν›„ 둜그인 μ‰˜ μƒνƒœλ‘œ 슀크립트λ₯Ό μ‹€ν–‰ν•˜λ©΄ ν˜„μž¬ μ‰˜μ΄ Bash인 것을 확인할 수 μžˆμŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜, λ¦¬λΆ€νŠΈ λͺ…령을 μˆ˜ν–‰ν•˜κ³ λ‚˜μ„œ 크둠탭에 μ˜ν•΄μ„œ μ‹€ν–‰λœ μŠ€ν¬λ¦½νŠΈμ— λŒ€ν•œ 둜그λ₯Ό ν™•μΈν•˜λ©΄ Bashκ°€ μ•„λ‹Œ κΈ°λ³Έ μ‰˜μ΄λΌκ³  κΈ°λ‘λ˜μ–΄μžˆμŠ΅λ‹ˆλ‹€.

./a.sh
SHELL: /bin/bash

# reboot with #!/bin/bash
tail a.log
SHELL: /bin/sh

# reboot with #!/bin/bash --login
tail a.log
SHELL: /bin/sh

# crontab -e && SHELL=/bin/bash
SHELL: /bin/bash

μœ„ κ²°κ³Όλ₯Ό ν† λŒ€λ‘œ μ‰˜ μŠ€ν¬λ¦½νŠΈμ—μ„œ μ…”λ±…κ³Ό ν•¨κ»˜ 둜그인 μ‰˜ μ˜΅μ…˜μ„ ν™œμ„±ν™”ν•˜λŠ” 것과 상관없이 μ‚¬μš©μžμ˜ κΈ°λ³Έ μ‰˜μ„ λ³€κ²½ν•˜κ±°λ‚˜ 크둠탭 μ„€μ • μ‹œ μ‰˜μ„ μ§€μ •ν•˜λ„λ‘ ν•˜μ—¬μ•Όν•œλ‹€λŠ” 것을 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

ν™˜κ²½λ³€μˆ˜ 파일

μ‰˜ μŠ€ν¬λ¦½νŠΈμ—μ„œ 둜그인 μ‰˜ μ˜΅μ…˜(–login)을 μ§€μ •ν•˜λŠ” 것은 정해진 ν™˜κ²½λ³€μˆ˜ νŒŒμΌμ„ λ‘œλ“œν•˜κΈ° μœ„ν•œ λ°©λ²•μž…λ‹ˆλ‹€. λ‹€λ§Œ, 둜그인 μ‰˜μ΄ μ μš©λ˜μ—ˆκΈ°μ— λ‹€μŒκ³Ό 같이 ~/.bashrcλŠ” λ‘œλ“œλ˜μ§€ μ•ŠλŠ” 것을 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

#!/bin/bash --login

tail a.log
Loaded /etc/profile
Loaded .profile
SHELL: /bin/bash

크둠탭에 μ˜ν•΄μ„œ μ‰˜ μŠ€ν¬λ¦½νŠΈκ°€ 싀행될 λ•Œμ—λŠ” Non-Interactive Shell λ°©μ‹μœΌλ‘œ λ™μž‘ν•œλ‹€λŠ” 점을 μΈμ§€ν•΄μ•Όν•©λ‹ˆλ‹€. μ΄λŠ” 둜그인 μ‰˜ μ˜΅μ…˜μ„ 지정해도 .bashrc 파일이 λ‘œλ“œλ˜μ§€ μ•Šμ•˜μŒμ„ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

결과적으둜, μž¬λΆ€νŒ…μ‹œμ—λ„ 크둠탭에 μ˜ν•΄μ„œ μ‰˜ 슀크립트λ₯Ό 톡해 ν”„λ‘œμ„ΈμŠ€κ°€ μžλ™μœΌλ‘œ μ‹€ν–‰λ˜κΈ° μœ„ν•΄μ„œλŠ” λ‹€μŒμ˜ λ°©μ•ˆ μ€‘μ—μ„œ ν™˜κ²½ λ³€μˆ˜κ°€ μ˜¬λ°”λ₯΄κ²Œ λ‘œλ“œλ  수 μžˆλ„λ‘ λ³„λ„μ˜ μž‘μ—…μ„ μˆ˜ν–‰ν•΄μ•Όν•©λ‹ˆλ‹€.

  1. .profile에 ν™˜κ²½ λ³€μˆ˜λ₯Ό μ§€μ •ν•œ 경우 –login μ˜΅μ…˜ κ³ λ €
  2. .bashrc λ˜λŠ” .bash_profile에 ν™˜κ²½ λ³€μˆ˜λ₯Ό μ§€μ •ν•œ 경우 νŒŒμΌμ„ 직접 λͺ…μ‹œν•˜μ—¬ λ‘œλ“œ
  3. ν”„λ‘œμ„ΈμŠ€ μ‹€ν–‰ μ‹œ ν•„μš”ν•œ ν™˜κ²½λ³€μˆ˜λ₯Ό μˆ˜λ™μœΌλ‘œ μ§€μ •ν•˜λŠ” 슀크립트 λ‘œλ“œ

크둠탭에 μ˜ν•΄μ„œ μ‰˜ μŠ€ν¬λ¦½νŠΈκ°€ μ •μƒμ μœΌλ‘œ μ‹€ν–‰λ˜μ§€ μ•ŠλŠ”λ‹€λ©΄ μ•Œλ§žμ€ μ‰˜κ³Ό ν™˜κ²½λ³€μˆ˜κ°€ μ˜¬λ°”λ₯΄κ²Œ λ‘œλ“œλ˜λŠ” 방식을 μ·¨ν•˜μ˜€λŠ”μ§€ κ²€ν† ν•˜μ‹œκΈ° λ°”λžλ‹ˆλ‹€.

μ°Έκ³