Crontab으로 주기적으로 명령어나 스크립트를 자동으로 실행시켜보자

Joshua·2024년 10월 2일
1

Linux

목록 보기
1/2

~~아 어렵다 어려워 리눅스의 세계란~~ㅠㅠ

현재 진행하고 있는 데이터 수집이 파이썬 파일을 정기적으로 실행 시켜줘야 한다
관련해서 알아보던 중 크론탭이란 것을 알게 되었고...
열심히 공부해보자는 마음으로 벨로그를 켰다🎯
또 얼마나 엄청난 것일지...!(아님)


1. Crontab 이란?

리눅스 및 유닉스 계열 운영 체제에서 주기적으로 명령어나 스크립트를 자동으로 실행하기 위해 사용하는 도구


2. Crontab 사용 이유

  • 자동화: 백업, 로그 정리 등 반복적으로 수행해야 하는 작업 자동화

  • 효율성: 정해진 시간에 자동으로 작업 실행 -> 다른 일을 할 수 있음

  • 신뢰성: 정기적으로 실행되는 작업은 수동 실행보다 오류가 적고, 효율적인 시스템 자원의 관리 가능


3. 장점

  • 정확한 주기 실행: 설정한 주기에 맞춰 정확하게 작업 실행

  • 리소스 절약: 불필요한 수동 작업을 줄여 시스템 리소스 절약

  • 유연성: 다양한 주기 설정 → 필요에 따라 작업의 실행 주기 쉽게 조정 가능

  • 모니터링: 실행 결과를 로그 파일에 기록하여 작업 성공 여부 확인


4. sh 파일은 뭔데?

쉘 스크립트 파일로, 리눅스 및 유닉스 계열 운영 체제에서 사용되는 스크립트
즉, sh 파일은 명령어를 순차적으로 실행하기 위해 작성된 텍스트 파일이다.
주로 시스템 관리, 자동화 작업, 프로그램 실행 등의 목적으로 사용된다.

1) .sh 파일의 구성

  • 쉘 스크립트: .sh 파일은 특정 쉘(예: Bash, Zsh)에서 실행될 명령어들을 포함
  • 명령어: 스크립트 내부에 포함된 명령어들은 쉘에서 직접 입력하는 것과 동일하게 작성

2) 예시

#!/bin/bash
#현재 날짜, 시간 출력

echo "$(date '+%Y-%m-%d %H:%M:%S') - Executing Python script."

🧐? "#!/bin/bash" << 이건 또 뭐야

#!/bin/bash는 쉘 스크립트의 첫 번째 줄에 위치하는 셰뱅(shebang) 으로,
이 스크립트가 어떤 인터프리터로 실행될지 지정하는 역할 !

1) #! (셰뱅)

  • 셰뱅 : (#!) 이 기호는 운영 체제에 해당 파일을 실행할 때 어떤 프로그램을 사용해야 하는지를 알려준다.
  • 인터프리터 지정 : #! 뒤에 오는 경로는 사용할 인터프리터의 경로

2) /bin/bash

  • 경로: Bash 셸의 경로. Bash는 리눅스에서 가장 널리 사용되는 쉘 중 하나
  • Bash 사용: 이 스크립트가 실행될 때, 시스템은 /bin/bash 경로에 있는 Bash 인터프리터를 호출하여 해당 스크립트를 실행함

3) .sh 파일 실행 방법

  • 파일 생성: 텍스트 편집기를 사용하여 .sh 파일 작성 (예: run.sh)
  • 실행 권한 부여: 다음 명령어로 실행 권한 부여

chmod +x run.sh

  • 스크립트 실행

./run.sh

4) 사용 용도

  • 자동화 : 반복 작업
  • 시스템 관리 : 서버 유지보수나 모니터링
  • 프로그램 실행 : 특정 환경 설정 후 다른 프로그램 실행

5. Crontab 사용 방법

1) Crontab 파일 열기
터미널에서 crontab -e 명령어 입력

2) 작업 추가
Crontab 파일에 주기적으로 실행할 작업 추가

* * * * * /User/user/run.sh
  • 각 별표의 의미
첫 번째 *: 분 (0-59)
두 번째 *: 시간 (0-23)
세 번째 *: 일 (1-31)
네 번째 *: 월 (1-12)
다섯 번째 *: 요일 (0-7) (0과 7은 일요일)

예를 들어, 매일 오전 2시에 run.sh 스크립트를 실행하고 싶다면:

0 2 * * * /User/user/run.sh

3) Crontab 파일 저장
파일을 수정한 후 저장하고 종료하면, 설정된 작업이 주기적으로 실행된다 !
ctrl + o 과 엔터 →저장
ctrl + x → 창 나오기

이렇게 나오면 성공적으로 저장한 것 !

😥 ".sh 자체는 실행이 되는데 crontab에 저장한 내용은 실행이 안되는 경우"

뭔소린가 싶지만 그런 경우가 있다
명령어로 직접 sh 파일을 실행하면 되지만 crontab에 작성한 내용은 실행이 안되는 경우, 거진 "실행 권한" 문제다
Crontab에서 스크립트를 실행하려면 그 스크립트 파일이 실행 가능한 상태여야 한다.

chmod +x /user/workspace/run.sh

이렇게 sh 파일에 권한을 부여해야 정상적으로 동작하게 된다 !!

아래 명령어로 해당 파일의 권한 여부를 확인할 수 있다😎

ls -l /user/workspace/run.sh


4) Crontab 기본 명령어

  • Crontab 편집

crontab -e

  • Crontab 작업 목록 확인

crontab -l

  • Crontab 작업 모두 삭제

crontab -r

  • 특정 파일로 Crontab 설정

crontab /path/to/file

  • 특정 파일에서 Crontab 작업 삭제

crontab -i -r /path/to/file


5) crontab 특수문자

콤마(,): 여러 값 지정 (1분, 2분, 3분)
대시(-): 범위 지정 (1분부터 5분까지)
별표(*): 모든 값 (매 분, 매 시간 등)
슬래시(/): 주기 지정 (매 5분마다)

6) 2>&1
리눅스/유닉스 환경에서 표준 오류(stderr)표준 출력(stdout) 으로 리다이렉션하는 명령

리눅스에서는 명령을 실행할 때 기본적으로 세 가지 스트림을 사용하는데,

  • 표준 입력(stdin): 0번 파일 디스크립터
  • 표준 출력(stdout): 1번 파일 디스크립터
  • 표준 오류(stderr): 2번 파일 디스크립터

2>&1는 표준 오류(2번 디스크립터)를 표준 출력(1번 디스크립터) 으로 리다이렉션하는 역할을 한다.

즉, 표준 출력과 표준 오류를 같은 곳으로 보낸다 !


6. 직접 작성한 걸 보여줘

나는 이런식으로 sh 파일을 작성하고

#!/bin/bash

LOG_FILE="/user/workspace/log/app.log"
# Python 스크립트 실행 시간 기록
echo "$(date '+%Y-%m-%d %H:%M:%S') - Executing Python script." >> $LOG_FILE

# Python 스크립트 실행
/user/conda/envs/analysis/bin/python3 /user/workspace/test.py >> $LOG_FILE 2>&1

# Python 스크립트 실행 완료 기록
echo "$(date '+%Y-%m-%d %H:%M:%S') - Python script execution finished." >> LOG_FILE

crontab -e 을 입력해서

# analysis
0 4 * * * /user/workspace/run.sh

ctrl + o 과 엔터를 눌러 저장하고
ctrl + x 빠져나왔다

다행히(?) 잘 찍히는 로그😗


실행 중인지 알고 싶으면

ps aux | grep python

이 명령어를 입력하면 된다.
내가 python 파일을 실행 중이니 실행 중인 모든 py 파일을 보여준다

이렇게 실행 중인 파일은

kill -9 2418152

명령어를 입력하여 강제 중지 시킬 수 있다


/
/

오늘도 엄청 열심히 공부한 리눅스
생소한 환경이라 처음엔 어버버했지만
보면 볼수록 재미있다. 내가 친 명령어대로 쭉쭉 내뱉는게🤭
아직 정말 정말 쌩 기초적인 내용이지만
리눅스는 좀 더 열심히 공부해보자 !

profile
🐥삐약이 개발자🐤

0개의 댓글

관련 채용 정보