웹사이트 검색

Cron을 사용하여 Ubuntu 18.04에서 작업을 자동화하는 방법


소개

Cron은 Linux 배포판을 포함하여 Unix 계열 운영 체제에서 발견되는 시간 기반 작업 스케줄링 데몬입니다. Cron은 백그라운드에서 실행되며 "cron 작업\이라고 하는 cron으로 예약된 작업이 자동으로 실행되므로 cron은 유지 관리 관련 작업을 자동화하는 데 유용합니다.

이 가이드는 cron의 특수 구문을 사용하여 작업을 예약하는 방법에 대한 개요를 제공합니다. 또한 작업 일정 작성 프로세스를 신속하게 처리하고 더 이해하기 쉽게 만드는 데 사용할 수 있는 몇 가지 바로 가기를 살펴봅니다.

전제 조건

이 가이드를 완료하려면 Ubuntu 18.04를 실행하는 컴퓨터에 액세스해야 합니다. 이것은 로컬 머신, 가상 머신 또는 가상 사설 서버일 수 있습니다.

이 가이드를 따르기 위해 사용하는 컴퓨터의 종류에 관계없이 관리 권한이 구성된 루트가 아닌 사용자가 있어야 합니다. 이를 설정하려면 Ubuntu 18.04용 초기 서버 설정 가이드를 따르세요.

크론 설치

거의 모든 Linux 배포판에는 어떤 형태의 cron이 기본적으로 설치되어 있습니다. 그러나 cron이 설치되지 않은 Ubuntu 시스템을 사용하는 경우 APT를 사용하여 설치할 수 있습니다.

Ubuntu 시스템에 cron을 설치하기 전에 컴퓨터의 로컬 패키지 색인을 업데이트하십시오.

  1. sudo apt update

    소개

    Cron은 Linux 배포판을 포함하여 Unix 계열 운영 체제에서 발견되는 시간 기반 작업 스케줄링 데몬입니다. Cron은 백그라운드에서 실행되며 "cron 작업\이라고 하는 cron으로 예약된 작업이 자동으로 실행되므로 cron은 유지 관리 관련 작업을 자동화하는 데 유용합니다.

    이 가이드는 cron의 특수 구문을 사용하여 작업을 예약하는 방법에 대한 개요를 제공합니다. 또한 작업 일정 작성 프로세스를 신속하게 처리하고 더 이해하기 쉽게 만드는 데 사용할 수 있는 몇 가지 바로 가기를 살펴봅니다.

    전제 조건

    이 가이드를 완료하려면 Ubuntu 18.04를 실행하는 컴퓨터에 액세스해야 합니다. 이것은 로컬 머신, 가상 머신 또는 가상 사설 서버일 수 있습니다.

    이 가이드를 따르기 위해 사용하는 컴퓨터의 종류에 관계없이 관리 권한이 구성된 루트가 아닌 사용자가 있어야 합니다. 이를 설정하려면 Ubuntu 18.04용 초기 서버 설정 가이드를 따르세요.

    크론 설치

    거의 모든 Linux 배포판에는 어떤 형태의 cron이 기본적으로 설치되어 있습니다. 그러나 cron이 설치되지 않은 Ubuntu 시스템을 사용하는 경우 APT를 사용하여 설치할 수 있습니다.

    Ubuntu 시스템에 cron을 설치하기 전에 컴퓨터의 로컬 패키지 색인을 업데이트하십시오.

    1. sudo apt update

    그런 다음 다음 명령을 사용하여 cron을 설치합니다.

    1. sudo apt install cron

    백그라운드에서도 실행되도록 설정되어 있는지 확인해야 합니다.

    1. sudo systemctl enable cron
    Output
    Synchronizing state of cron.service with SysV service script with /lib/systemd/systemd-sysv-install. Executing: /lib/systemd/systemd-sysv-install enable cron

    그러면 cron이 시스템에 설치되고 작업 예약을 시작할 준비가 됩니다.

    Cron 작동 방식 이해

    Cron 작업은 crontab이라는 특수 파일에 기록되고 관리됩니다. 시스템의 각 사용자 프로필에는 /var/spool/cron/crontabs/에 저장되는 작업을 예약할 수 있는 고유한 crontab이 있을 수 있습니다.

    작업을 예약하려면 편집을 위해 crontab을 열고 cron 표현식 형식으로 작성된 작업을 추가합니다. cron 표현식의 구문은 스케줄과 실행할 명령의 두 가지 요소로 나눌 수 있습니다.

    명령은 일반적으로 명령줄에서 실행하는 거의 모든 명령이 될 수 있습니다. 구문의 일정 구성 요소는 다음 순서로 작성된 5개의 서로 다른 필드로 분류됩니다.

    Field Allowed Values
    minute 0-59
    hour 0-23
    Day of the month 1-31
    month 1-12 or JAN-DEC
    Day of the week 0-6 or SUN-SAT

    함께 crontab에서 예약된 작업은 다음과 같이 구성됩니다.

    minute hour day_of_month month day_of_week command_to_run
    

    다음은 cron 표현식의 기능적 예입니다. 이 표현식은 매주 화요일 오후 5시 30분에 curl http://www.google.com 명령을 실행합니다.

    30 17 * * 2 curl http://www.google.com
    

    예약 작업을 간소화하기 위해 cron 표현식의 일정 구성 요소에 포함할 수 있는 몇 가지 특수 문자도 있습니다.

    • *: cron 표현식에서 별표는 "all\을 나타내는 와일드카드 변수입니다. 따라서 * * * * * ...로 예약된 작업은 매월 매일 매시간 매분 실행됩니다.
    • ,: 쉼표는 일정 값을 분할하여 목록을 형성합니다. 두 개의 개별 작업(예: 0 * * * * ...30 * * *)을 작성하는 대신 매시간 시작과 중간에 작업을 실행하려는 경우 * ...) 하나(0,30 * * * * ...)로 동일한 기능을 달성할 수 있습니다.
    • -: 하이픈은 일정 필드의 값 범위를 나타냅니다. 매시간 처음 30분 동안 실행하려는 명령에 대해 30개의 개별 예약 작업을 갖는 대신(예: 0 * * * * ..., 1 * * * * . .., 2 * * * * ... 등), 대신 0-29 * * * * ...로 예약할 수 있습니다.
    • /: 별표와 함께 슬래시를 사용하여 단계 값을 표현할 수 있습니다. 예를 들어 8개의 개별 cron 작업을 작성하여 3시간마다 명령을 실행하는 대신(예: 0 0 * * * ..., 0 3 * * * ..., 0 6 * * * ... 등) 다음과 같이 실행되도록 예약할 수 있습니다. 0 */3 * * * ....

    참고: 단계 값을 임의로 표현할 수 없습니다. 해당 필드에서 허용하는 범위로 균등하게 나누는 정수만 사용할 수 있습니다. 예를 들어 "hours\ 필드에서 슬래시 뒤에는 1, 2, 3, 4<만 사용할 수 있습니다. /코드>, <코드>6, <코드>8 또는 <코드>12.

    다음은 cron의 스케줄링 구성 요소를 사용하는 방법에 대한 몇 가지 추가 예입니다.

    • * * * * * - 1분마다 명령을 실행합니다.
    • 12 * * * * - 매시 12분마다 명령을 실행합니다.
    • 0,15,30,45 * * * * - 15분마다 명령을 실행합니다.
    • */15 * * * * - 15분마다 명령을 실행합니다.
    • 0 4 * * * - 매일 오전 4시에 명령을 실행합니다.
    • 0 4 * * 2-4 - 매주 화요일, 수요일, 목요일 오전 4시에 명령을 실행합니다.
    • 20,40 */8 * 7-12 * - 지난 6개월 동안 매일 매 8시 20분과 40분에 명령을 실행합니다.

    이 내용이 혼란스럽거나 자신의 cron 작업 일정을 작성하는 데 도움이 필요하면 "Crontab Guru\를 사용하여 cron 일정이 유효합니다.

    Crontab 관리

    일정을 정하고 실행하려는 작업을 알게 되면 데몬이 읽을 수 있는 위치에 배치해야 합니다.

    이전에 언급했듯이 crontabcron이 실행할 작업 일정을 보유하는 특수 파일입니다. 그러나 직접 편집할 수는 없습니다. 대신 crontab 명령을 사용하는 것이 좋습니다. 이렇게 하면 sudo로 권한을 변경하지 않고도 사용자 프로필의 crontab을 편집할 수 있습니다. crontab 명령은 또한 crontab에 구문 오류가 있는지 알려주지만 직접 편집하는 동안에는 그렇지 않습니다.

    다음 명령을 사용하여 crontab을 편집할 수 있습니다.

    1. crontab -e

    이 사용자 프로필에서 crontab 명령을 처음 실행하는 경우 crontab을 편집할 때 사용할 기본 텍스트 편집기를 선택하라는 메시지가 표시됩니다.

    Output
    no crontab for sammy - using an empty one Select an editor. To change later, run 'select-editor'. 1. /bin/nano <---- easiest 2. /usr/bin/vim.basic 3. /usr/bin/vim.tiny 4. /bin/ed Choose 1-4 [1]:

    선택한 편집기에 해당하는 번호를 입력합니다. 또는 ENTER를 눌러 기본 선택인 nano를 수락할 수 있습니다.

    선택한 후 사용 방법에 대한 주석 처리된 지침이 포함된 새로운 crontab으로 이동합니다.

    # 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
    

    나중에 crontab -e를 실행하면 자동으로 이 텍스트 편집기에 crontab이 표시됩니다. 편집기에서 각 작업의 일정을 새 줄에 입력할 수 있습니다. 그렇지 않으면 지금은 crontab을 저장하고 닫을 수 있습니다(CTRL + X, Y, nano를 선택한 경우 ENTER). 코드>).

    참고: Linux 시스템에는 /etc/ 디렉토리 아래에 다른 crontab이 저장되어 있습니다. 이것은 각 cron 작업이 실행되어야 하는 사용자 프로필에 대한 추가 필드가 있는 시스템 전체 crontab입니다. 이 자습서는 사용자별 crontabs에 중점을 두지만 시스템 전체 crontab을 편집하려는 경우 다음 명령을 사용하여 편집할 수 있습니다.

    1. sudo nano /etc/crontab

    crontab의 내용을 보고 싶지만 편집하지는 않으려면 다음 명령을 사용할 수 있습니다.

    1. crontab -l

    다음 명령을 사용하여 crontab을 지울 수 있습니다.

    경고: 다음 명령은 crontab을 지울 것인지 확인하는 메시지를 표시하지 않습니다. 확실히 지우고 싶은 경우에만 실행하십시오.

    1. crontab -r

    이 명령은 사용자의 crontab을 즉시 삭제합니다. 그러나 -i 플래그를 포함하여 실제로 사용자의 crontab을 삭제할 것인지 확인하는 명령 프롬프트를 표시할 수 있습니다.

    1. crontab -r -i
    Output
    crontab: really delete sammy's crontab? (y/n)

    메시지가 나타나면 y를 입력하여 crontab을 삭제하거나 n을 입력하여 삭제를 취소해야 합니다.

    Cron 작업 출력 관리

    cron 작업은 백그라운드에서 실행되기 때문에 성공적으로 실행되었는지 항상 명확하지는 않습니다. 이제 crontab 명령을 사용하는 방법과 cron 작업을 예약하는 방법을 알았으므로 cron의 출력을 리디렉션하는 몇 가지 다른 방법을 실험할 수 있습니다. 작업이 성공적으로 실행되었는지 추적하는 데 도움이 됩니다.

    서버에 Sendmail이 설치되고 적절하게 구성되어 있는 경우 cron 작업의 출력을 Linux 사용자 프로필과 연결된 이메일 주소로 보낼 수 있습니다. crontab 상단에 MAILTO 설정을 제공하여 이메일 주소를 수동으로 지정할 수도 있습니다.

    예를 들어 crontab에 다음 줄을 추가할 수 있습니다. 여기에는 MAILTO 문 뒤에 예시 이메일 주소, 실행할 셸을 나타내는 SHELL 지시문(이 예에서는 bash), cron 바이너리 및 단일 cron 작업을 검색할 경로를 가리키는 HOME 지시문:

    . . .
    
    MAILTO="example@linux-console.net"
    SHELL=/bin/bash
    HOME=/
    
    * * * * * echo ‘Run this command every minute’
    

    이 특정 작업은 "매분 이 명령 실행\을 반환하고 해당 출력은 MAILTO 지시문 뒤에 지정된 이메일 주소로 매분 이메일로 전송됩니다.

    또한 cron 작업의 출력을 로그 파일이나 빈 위치로 리디렉션하여 출력이 포함된 이메일을 받지 않도록 할 수 있습니다.

    예약된 명령의 출력을 로그 파일에 추가하려면 명령 끝에 >>를 추가하고 다음과 같이 선택한 로그 파일의 이름과 위치를 추가합니다.

    * * * * * echo ‘Run this command every minute’ >> /directory/path/file.log
    

    cron을 사용하여 스크립트를 실행하지만 백그라운드에서 계속 실행하고 싶다고 가정해 보겠습니다. 이렇게 하려면 스크립트의 출력을 /dev/null과 같은 빈 위치로 리디렉션하여 작성된 데이터를 즉시 삭제합니다. 예를 들어 다음 cron 작업은 PHP 스크립트를 실행하고 백그라운드에서 실행합니다.

    * * * * * /usr/bin/php /var/www/domain.com/backup.php > /dev/null 2>&1
    

    cron 작업은 또한 2로 표시되는 표준 오류를 표준 출력(>&1)으로 리디렉션합니다. 표준 출력이 이미 /dev/null로 리디렉션되고 있기 때문에 기본적으로 스크립트가 자동으로 실행될 수 있습니다. crontabMAILTO 문이 포함되어 있어도 명령의 출력은 지정된 이메일 주소로 전송되지 않습니다.

    액세스 제한

    cron.allowcron.deny 파일과 함께 crontab 명령을 사용할 수 있는 사용자를 관리할 수 있습니다. /etc/ 디렉토리. cron.deny 파일이 존재하는 경우 파일에 나열된 모든 사용자는 crontab을 편집할 수 없습니다. cron.allow가 존재하는 경우 여기에 나열된 사용자만 crontab을 편집할 수 있습니다. 두 파일이 모두 존재하고 동일한 사용자가 각 파일에 나열되어 있으면 cron.allow 파일이 cron.deny를 무시하고 사용자가 crontab을 편집할 수 있습니다.

    예를 들어 모든 사용자의 액세스를 거부한 다음 사용자 ishmael에게 액세스 권한을 부여하려면 다음 명령 시퀀스를 사용할 수 있습니다.

    1. sudo echo ALL >>/etc/cron.deny
    2. sudo echo ishmael >>/etc/cron.allow

    먼저 ALLcron.deny 파일에 추가하여 모든 사용자를 잠급니다. 그런 다음 사용자 이름을 cron.allow 파일에 추가하여 cron 작업을 실행할 수 있는 ishmael 사용자 프로필 액세스 권한을 부여합니다.

    사용자에게 sudo 권한이 있는 경우 다음 명령을 사용하여 다른 사용자의 crontab을 편집할 수 있습니다.

    1. sudo crontab -u user -e

    그러나 cron.deny가 있고 user가 목록에 있고 cron.allow에 나열되지 않은 경우 다음을 받게 됩니다. 이전 명령을 실행한 후 다음 오류:

    Output
    The user user cannot use this program (crontab)

    기본적으로 대부분의 cron 데몬은 cron.allow 또는 cron.denycron에 액세스할 수 있다고 가정합니다. > 존재합니다.

    특수 구문

    작업 예약을 간소화하는 데 도움이 되도록 crontab 파일에서 사용할 수 있는 몇 가지 속기 명령도 있습니다. 기본적으로 지정된 등가 숫자 일정에 대한 바로 가기입니다.

    Shortcut Shorthand for
    @hourly 0 * * * *
    @daily 0 0 * * *
    @weekly 0 0 * * 0
    @monthly 0 0 1 * *
    @yearly 0 0 1 1 *

    참고: 모든 cron 데몬이 이 구문(특히 이전 버전)을 구문 분석할 수 있는 것은 아니므로 의존하기 전에 작동하는지 다시 확인하십시오.

    또한 @reboot 속기는 서버가 시작될 때마다 뒤에 오는 모든 명령을 실행합니다.

    @reboot echo "System start up"
    

    가능할 때마다 이러한 단축키를 사용하면 crontab에서 작업 일정을 더 쉽게 해석할 수 있습니다.

    결론

    Cron은 시스템 관리와 관련된 많은 작업의 부담을 줄일 수 있는 유연하고 강력한 유틸리티입니다. 셸 스크립트와 결합하면 일반적으로 지루하거나 복잡한 작업을 자동화할 수 있습니다. 예를 들어 셸 스크립트를 작성하여 개체 스토리지 솔루션에 데이터 백업을 보낸 다음 cron으로 자동화할 수 있습니다.