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
을 설치하기 전에 컴퓨터의 로컬 패키지 색인을 업데이트하십시오.
또는 <코드>12.
- sudo apt update
소개
Cron은 Linux 배포판을 포함하여 Unix 계열 운영 체제에서 발견되는 시간 기반 작업 스케줄링 데몬입니다. Cron은 백그라운드에서 실행되며 "cron 작업\이라고 하는
cron
으로 예약된 작업이 자동으로 실행되므로 cron은 유지 관리 관련 작업을 자동화하는 데 유용합니다.이 가이드는 cron의 특수 구문을 사용하여 작업을 예약하는 방법에 대한 개요를 제공합니다. 또한 작업 일정 작성 프로세스를 신속하게 처리하고 더 이해하기 쉽게 만드는 데 사용할 수 있는 몇 가지 바로 가기를 살펴봅니다.
전제 조건
이 가이드를 완료하려면 Ubuntu 18.04를 실행하는 컴퓨터에 액세스해야 합니다. 이것은 로컬 머신, 가상 머신 또는 가상 사설 서버일 수 있습니다.
이 가이드를 따르기 위해 사용하는 컴퓨터의 종류에 관계없이 관리 권한이 구성된 루트가 아닌 사용자가 있어야 합니다. 이를 설정하려면 Ubuntu 18.04용 초기 서버 설정 가이드를 따르세요.
크론 설치
거의 모든 Linux 배포판에는 어떤 형태의
cron
이 기본적으로 설치되어 있습니다. 그러나cron
이 설치되지 않은 Ubuntu 시스템을 사용하는 경우 APT를 사용하여 설치할 수 있습니다.Ubuntu 시스템에
cron
을 설치하기 전에 컴퓨터의 로컬 패키지 색인을 업데이트하십시오.
- sudo apt update
그런 다음 다음 명령을 사용하여
cron
을 설치합니다.
- sudo apt install cron
백그라운드에서도 실행되도록 설정되어 있는지 확인해야 합니다.
- sudo systemctl enable cron
OutputSynchronizing 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
orJAN-DEC
Day of the week 0-6
orSUN-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다음은 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 관리
일정을 정하고 실행하려는 작업을 알게 되면 데몬이 읽을 수 있는 위치에 배치해야 합니다.
이전에 언급했듯이 crontab
은 cron
이 실행할 작업 일정을 보유하는 특수 파일입니다. 그러나 직접 편집할 수는 없습니다. 대신 crontab
명령을 사용하는 것이 좋습니다. 이렇게 하면 sudo
로 권한을 변경하지 않고도 사용자 프로필의 crontab
을 편집할 수 있습니다. crontab
명령은 또한 crontab
에 구문 오류가 있는지 알려주지만 직접 편집하는 동안에는 그렇지 않습니다.
다음 명령을 사용하여 crontab
을 편집할 수 있습니다.
- crontab -e
이 사용자 프로필에서 crontab
명령을 처음 실행하는 경우 crontab
을 편집할 때 사용할 기본 텍스트 편집기를 선택하라는 메시지가 표시됩니다.
Outputno 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
을 편집하려는 경우 다음 명령을 사용하여 편집할 수 있습니다.
- sudo nano /etc/crontab
crontab
의 내용을 보고 싶지만 편집하지는 않으려면 다음 명령을 사용할 수 있습니다.
- crontab -l
다음 명령을 사용하여 crontab
을 지울 수 있습니다.
경고: 다음 명령은 crontab
을 지울 것인지 확인하는 메시지를 표시하지 않습니다. 확실히 지우고 싶은 경우에만 실행하십시오.
- crontab -r
이 명령은 사용자의 crontab
을 즉시 삭제합니다. 그러나 -i
플래그를 포함하여 실제로 사용자의 crontab
을 삭제할 것인지 확인하는 명령 프롬프트를 표시할 수 있습니다.
- crontab -r -i
Outputcrontab: 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
로 리디렉션되고 있기 때문에 기본적으로 스크립트가 자동으로 실행될 수 있습니다. crontab
에 MAILTO
문이 포함되어 있어도 명령의 출력은 지정된 이메일 주소로 전송되지 않습니다.
액세스 제한
cron.allow
및 cron.deny
파일과 함께 crontab
명령을 사용할 수 있는 사용자를 관리할 수 있습니다. /etc/
디렉토리. cron.deny
파일이 존재하는 경우 파일에 나열된 모든 사용자는 crontab
을 편집할 수 없습니다. cron.allow
가 존재하는 경우 여기에 나열된 사용자만 crontab을 편집할 수 있습니다. 두 파일이 모두 존재하고 동일한 사용자가 각 파일에 나열되어 있으면 cron.allow
파일이 cron.deny
를 무시하고 사용자가 crontab
을 편집할 수 있습니다.
예를 들어 모든 사용자의 액세스를 거부한 다음 사용자 ishmael에게 액세스 권한을 부여하려면 다음 명령 시퀀스를 사용할 수 있습니다.
- sudo echo ALL >>/etc/cron.deny
- sudo echo ishmael >>/etc/cron.allow
먼저 ALL
을 cron.deny
파일에 추가하여 모든 사용자를 잠급니다. 그런 다음 사용자 이름을 cron.allow
파일에 추가하여 cron
작업을 실행할 수 있는 ishmael 사용자 프로필 액세스 권한을 부여합니다.
사용자에게 sudo
권한이 있는 경우 다음 명령을 사용하여 다른 사용자의 crontab
을 편집할 수 있습니다.
- sudo crontab -u user -e
그러나 cron.deny
가 있고 user가 목록에 있고 cron.allow
에 나열되지 않은 경우 다음을 받게 됩니다. 이전 명령을 실행한 후 다음 오류:
OutputThe user user cannot use this program (crontab)
기본적으로 대부분의 cron
데몬은 cron.allow
또는 cron.deny
cron에 액세스할 수 있다고 가정합니다. > 존재합니다.
특수 구문
작업 예약을 간소화하는 데 도움이 되도록 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으로 자동화할 수 있습니다.