Linux 에서 at 과 cron 을 이용한 작업 예약

CompTIABeginner
지금 연습하기

소개

이 실습에서는 Linux 환경에서의 작업 예약 기초를 배웁니다. 미래의 특정 시간에 한 번 실행되도록 작업을 예약하는 at 유틸리티와 일별, 주별 또는 월별과 같이 정기적인 일정에 따라 실행되어야 하는 반복 작업을 자동화하는 cron 유틸리티, 이 두 가지 필수 명령줄 도구를 살펴봅니다.

먼저 실습 환경을 준비하고 atcron 서비스가 설치되어 활성화되어 있는지 확인하는 것으로 시작합니다. 그런 다음 at 명령어로 일회성 작업을 생성하고 atqatrm으로 작업 대기열을 관리하는 연습을 합니다. 마지막으로 crontab 명령어를 사용하여 반복되는 cron 작업을 생성, 확인 및 삭제함으로써 시스템 관리 작업을 자동화하는 실무 경험을 쌓게 됩니다.

이 실습은 학습과 연습을 돕기 위해 단계별 지침을 제공하는 가이드 실습입니다. 각 단계를 완료하고 실무 경험을 쌓으려면 지침을 주의 깊게 따르십시오. 과거 데이터에 따르면 이 실습은 완료율 95%초급 수준 실습입니다. 학습자들로부터 99%의 긍정적인 평가를 받았습니다.

실습 환경 준비

이 단계에서는 Linux 에서 작업을 예약하는 데 필요한 도구를 설치하여 실습 환경을 준비합니다. 우리가 사용할 두 가지 주요 도구는 일회성 작업을 위한 at과 반복 작업을 위한 cron입니다. 일반적으로 대부분의 Linux 시스템에는 cron이 미리 설치되어 있지만, at 유틸리티는 수동으로 설치해야 할 수도 있습니다.

먼저, 최신 버전의 소프트웨어를 가져올 수 있도록 패키지 목록을 업데이트합니다.

sudo apt-get update

저장소에서 패키지 목록을 다운로드함에 따라 관련 출력이 표시됩니다.

다음으로 apt-get 명령어를 사용하여 at 패키지를 설치합니다. -y 플래그는 설치 확인 질문에 자동으로 동의하므로 별도의 입력이 필요하지 않습니다.

sudo apt-get install -y at

설치 진행 상황이 출력됩니다. 설치가 완료되면 시스템에서 at 명령어를 사용할 수 있습니다.

at 명령어는 예약된 작업을 실행하기 위해 atd라는 백그라운드 서비스 (데몬) 에 의존합니다. 이 서비스가 실행 중인지 확인해야 합니다. systemctl 명령어로 상태를 확인할 수 있습니다.

sudo systemctl status atd

출력 결과에 서비스가 active (running) 상태로 표시되어야 합니다.

● atd.service - Deferred execution scheduler
     Loaded: loaded (/lib/systemd/system/atd.service; enabled; vendor preset: enabled)
     Active: active (running) since <date_time>; <time_ago>
       Docs: man:atd(8)
   Main PID: <pid> (atd)
      Tasks: 1 (limit: 4622)
     Memory: 248.0K
        CPU: 11ms
     CGroup: /system.slice/atd.service
             └─<pid> /usr/sbin/atd -f

만약 서비스가 활성화되어 있지 않다면 다음 명령어로 시작할 수 있습니다.

sudo systemctl start atd

마지막으로, 나중에 사용할 cron 서비스도 활성화되어 있는지 확인해 보겠습니다.

sudo systemctl status cron

출력 결과에 마찬가지로 active (running)이 표시되어야 하며, 이는 cron 데몬이 예약된 작업을 처리할 준비가 되었음을 의미합니다.

● cron.service - Regular background program processing daemon
     Loaded: loaded (/lib/systemd/system/cron.service; enabled; vendor preset: enabled)
     Active: active (running) since <date_time>; <time_ago>
       Docs: man:cron(8)
   Main PID: <pid> (cron)
      Tasks: 1 (limit: 4622)
     Memory: 1.1M
        CPU: 40ms
     CGroup: /system.slice/cron.service
             └─<pid> /usr/sbin/cron -f

atdcron 서비스가 모두 실행 중이므로 이제 프로세스를 예약할 모든 준비가 끝났습니다.

at 명령어로 일회성 작업 예약하기

이 단계에서는 at 명령어를 사용하여 미래의 특정 시점에 한 번만 실행될 작업을 예약하는 방법을 배웁니다. 이는 즉시 실행할 필요는 없지만 정기적으로 반복할 필요도 없는 스크립트나 명령어를 실행할 때 유용합니다. at 명령어는 표준 입력으로부터 일련의 명령어를 읽어 지정된 시간에 실행될 하나의 "at-job"으로 수집합니다.

현재 프로젝트 디렉토리 (~/project) 에 at_output.txt라는 파일을 생성하는 간단한 명령어를 예약해 보겠습니다. 지금으로부터 1 분 후에 실행되도록 설정하겠습니다.

먼저, 원하는 시간 규격과 함께 at 명령어를 호출합니다.

at now + 1 minute

Enter 키를 누르면 터미널 프롬프트가 at>로 바뀝니다. 이는 at이 예약할 명령어를 입력받기 위해 대기 중임을 나타냅니다. 이제 파일을 생성하고 텍스트를 기록하는 명령어를 입력합니다.

echo "The at job executed successfully." > ~/project/at_output.txt

명령어를 입력한 후 Enter 키를 누릅니다. 작업을 완료하고 at> 프롬프트를 빠져나가려면 Ctrl-D를 누릅니다. 작업 번호 및 실행 시간과 함께 작업이 예약되었다는 확인 메시지가 표시됩니다.

warning: commands will be executed using /bin/sh
job 1 at Mon Jan 1 12:01:00 2024

이제 예약된 작업이 실행될 때까지 1 분 동안 기다려야 합니다.

1 분이 지난 후, at_output.txt 파일이 생성되었는지 확인하여 작업이 실행되었는지 검증할 수 있습니다. ls -l 명령어를 사용하여 파일 상세 정보를 확인합니다.

ls -l ~/project/at_output.txt

작업이 성공적으로 실행되었다면 출력 목록에 파일이 나타납니다.

-rw-r--r-- 1 labex labex 35 Jan  1 12:01 /home/labex/project/at_output.txt

다음으로 cat 명령어를 사용하여 파일 내용을 확인하고 echo 명령어가 예상대로 작동했는지 확인합니다.

cat ~/project/at_output.txt

터미널에 다음과 같은 출력이 표시되어야 합니다.

The at job executed successfully.

마지막으로 다음 단계를 위해 프로젝트 디렉토리를 깨끗하게 유지하도록 방금 생성한 파일을 삭제합니다.

rm ~/project/at_output.txt

이제 at 명령어를 사용하여 일회성 작업을 성공적으로 예약, 확인 및 정리했습니다.

atq 와 atrm 으로 대기 중인 작업 관리하기

이 단계에서는 예약된 at 작업을 확인하고 취소하는 방법을 배웁니다. 작업을 예약한 후 나중에 더 이상 필요하지 않거나 수정이 필요하다는 것을 깨닫는 경우가 많습니다. atq 명령어는 대기 중인 작업 목록을 보여주며, atrm 명령어는 해당 작업을 삭제할 수 있게 해줍니다.

먼저, 관리할 시간을 확보할 수 있도록 충분히 먼 미래에 실행될 작업을 예약해 보겠습니다. 10 분 후에 실행될 명령어를 예약합니다.

at now + 10 minutes

at> 프롬프트에서 파일을 생성하는 명령어를 입력합니다. 파일 이름은 temporary_job.txt로 하겠습니다.

touch ~/project/temporary_job.txt

Enter 를 누른 다음 Ctrl-D를 눌러 작업을 저장합니다. 시스템이 작업 생성을 확인하고 작업 번호를 표시합니다. 작업을 삭제할 때 필요하므로 이 작업 번호를 메모해 두세요.

warning: commands will be executed using /bin/sh
job 2 at Mon Jan 1 12:10:00 2024

(참고: 실제 작업 번호와 시간은 다를 수 있습니다.)

이제 대기 중인 모든 작업 목록을 보려면 atq (at queue) 명령어를 사용합니다.

atq

출력 결과에는 작업 번호, 예약된 날짜 및 시간, 속한 큐 (a), 작업을 예약한 사용자가 표시됩니다.

2 Mon Jan 1 12:10:00 2024 a labex

이 작업을 더 이상 실행하고 싶지 않다고 가정해 봅시다. 앞서 메모해 둔 작업 번호를 사용하여 atrm (at remove) 명령어로 취소할 수 있습니다.

아래 명령어에서 <job_number>를 실제 작업 번호로 바꾸세요. 예를 들어 작업 번호가 2였다면 atrm 2를 실행합니다.

atrm <job_number>

작업이 성공적으로 삭제되면 아무런 출력도 나타나지 않습니다.

작업이 대기열에서 제거되었는지 확인하려면 atq를 다시 실행합니다.

atq

이번에는 아무런 출력도 나오지 않아야 합니다. 이는 at 작업 대기열이 비어 있으며 temporary_job.txt 파일이 생성되지 않을 것임을 확인해 줍니다.

crontab -e 로 반복 작업 생성하기

이 단계에서는 cron을 사용하여 반복 작업을 예약하는 방법을 배웁니다. 작업을 한 번만 실행하는 at과 달리, cron은 일정에 따라 작업을 반복적으로 실행하도록 설계되었습니다. 예약된 작업은 crontab이라는 특수 파일에서 관리합니다.

사용자의 crontab 파일을 편집하려면 crontab -e 명령어를 사용합니다. 여기서 -e는 "edit(편집)"을 의미합니다.

편집을 위해 crontab 파일을 열어보겠습니다.

crontab -e

crontab -e를 처음 실행하는 경우 기본 텍스트 편집기를 선택하라는 메시지가 표시될 수 있습니다. 사용하기 쉬운 nano를 권장합니다.

Select an editor. To change later, run 'select-editor'.
  1. /bin/nano        <---- 가장 쉬움
  2. /usr/bin/vim.basic
  ...

Choose 1-2 [1]:

1을 입력하고 Enter를 눌러 nano를 선택합니다. crontab 파일이 열립니다. 사용법을 설명하는 몇 가지 주석을 제외하고는 대부분 비어 있을 것입니다.

crontab 항목은 6 개의 필드로 구성된 특정 형식을 가집니다.
분 시 일 월 요일 명령어

시간 필드에 별표 (*) 를 사용하면 와일드카드로 작동하여 "매 (every)"를 의미합니다. 이번 실습에서는 매분마다 명령어를 실행하려고 합니다. 이는 결과를 확인하기 위해 오래 기다릴 필요가 없으므로 테스트하기에 완벽합니다. "매분"에 대한 일정 설정은 * * * * *입니다.

이제 파일 끝에 새 줄을 추가하여 현재 날짜와 시간을 프로젝트 디렉토리의 cron_log.txt라는 로그 파일에 추가하는 작업을 예약합니다.

* * * * * date >> ~/project/cron_log.txt

줄을 추가한 후 편집기 화면은 다음과 같아야 합니다.

## Edit this file to introduce tasks to be run by cron.
#
## Each task to run has to be defined through a single line
## indicating with different fields when the task will be run
## and what command to run for the task
#
## To define the time you can provide concrete values for
## minute (m), hour (h), day of month (dom), month (mon),
## and day of week (dow) or use '*' in these fields (for 'any').
#
## Notice that tasks will be started based on the cron's system
## daemon's notion of time and timezones.
#
## Output of the crontab jobs (including errors) is sent through
## email to the user the crontab file belongs to (unless redirected).
#
## For example, you can run a backup of all your user accounts
## at 5 a.m. every week with:
## 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
#
## For more information see the manual pages of crontab(5) and cron(8)
#
## m h  dom mon dow   command
* * * * * date >> ~/project/cron_log.txt

파일을 저장하고 nano를 종료하려면 Ctrl-X를 누르고, 변경 사항을 확인하기 위해 Y를 누른 다음, 마지막으로 Enter를 눌러 파일에 기록합니다.

종료하면 터미널에 확인 메시지가 표시됩니다.

crontab: installing new crontab

이는 새로운 cron 작업이 활성화되었음을 의미합니다. 이제 cron 데몬은 매분 이 파일을 확인하고 명령어를 실행합니다.

최소 1 분 동안 기다립니다. 그런 다음 로그 파일이 생성되었는지 확인합니다.

ls -l ~/project/cron_log.txt

목록에 파일이 표시되어야 합니다.

-rw-r--r-- 1 labex labex 29 Jan  1 12:15 /home/labex/project/cron_log.txt

이제 내용을 확인해 봅니다.

cat ~/project/cron_log.txt

출력 결과에는 명령어가 처음 실행된 날짜와 시간이 표시됩니다.

Mon Jan  1 12:15:01 UTC 2024

1 분을 더 기다린 후 cat 명령어를 다시 실행하면 업데이트된 타임스탬프와 함께 새 줄이 추가된 것을 볼 수 있으며, 이는 작업이 반복적으로 실행되고 있음을 증명합니다.

crontab -l 및 -r 로 Cron 작업 확인 및 삭제하기

마지막 단계에서는 편집기를 열지 않고 예약된 cron 작업을 확인하는 방법과 작업을 완전히 삭제하는 방법을 배웁니다. 이는 시스템의 예약된 작업을 체계적이고 깨끗하게 유지하기 위한 필수적인 관리 작업입니다.

먼저, 현재 활성화된 cron 작업을 나열해 보겠습니다. crontab -l 명령어 (-l은 "list"를 의미) 는 crontab 파일의 내용을 터미널에 직접 표시합니다.

crontab -l

출력 결과에 이전 단계에서 생성한 작업이 표시됩니다.

## Edit this file to introduce tasks to be run by cron.
## ... (기타 주석) ...
## m h  dom mon dow   command
* * * * * date >> ~/project/cron_log.txt

이 명령어는 어떤 작업이 예약되어 있는지 확인하는 안전한 읽기 전용 방법입니다.

이제 이 반복 작업이 더 이상 필요하지 않다고 가정해 보겠습니다. 이를 삭제하려면 crontab -r 명령어 (-r은 "remove"를 의미) 를 사용할 수 있습니다. 이 명령어는 확인 절차 없이 사용자의 전체 crontab 파일을 삭제하므로 매우 주의해서 사용해야 합니다.

crontab 을 삭제하는 명령어를 실행합니다.

crontab -r

성공적으로 삭제되면 아무런 출력도 나타나지 않습니다.

crontab 이 삭제되었는지 확인하려면 list 명령어를 다시 실행합니다.

crontab -l

이번에는 더 이상 crontab 파일이 없음을 나타내는 오류 메시지가 반환됩니다.

no crontab for labex

이는 예약된 작업이 성공적으로 제거되었으며 더 이상 실행되지 않음을 확인해 줍니다.

마지막으로 실습을 마치고 작업 공간을 정리하기 위해 cron 작업에 의해 생성된 cron_log.txt 파일을 삭제합니다.

rm ~/project/cron_log.txt

이제 cron 작업을 성공적으로 나열, 삭제 및 삭제 확인까지 마쳐 전체 관리 수명 주기를 완료했습니다.

요약

이 실습에서는 at 패키지를 설치하고 atdcron 서비스가 활성화되어 있는지 확인하여 작업 예약을 위한 Linux 환경을 준비하는 방법을 배웠습니다. at 명령어를 사용하여 미래에 실행될 일회성 작업을 예약하는 연습을 했습니다. 또한 atq로 대기열을 확인하고 atrm으로 특정 작업을 삭제하여 이러한 대기 중인 작업을 관리하는 방법도 배웠습니다.

더 나아가 cron을 사용하여 반복 작업을 예약하는 방법을 살펴보았습니다. crontab -e 명령어를 사용하여 사용자의 crontab 파일을 편집하고 새로운 자동화 작업을 추가했습니다. 마지막으로 crontab -l로 현재 예약된 cron 작업 목록을 확인하는 방법과 crontab -r 명령어를 사용하여 사용자의 모든 예약된 cron 작업을 삭제하는 방법을 배웠습니다.