주:
- 이 자습서는 Oracle에서 제공하는 무료 실습 환경에서 사용할 수 있습니다.
- Oracle Cloud Infrastructure 인증서, 테넌시 및 구획에 예제 값을 사용합니다. 실습을 완료할 때 이러한 값을 클라우드 환경과 관련된 값으로 대체하십시오.
Oracle Linux에서 시스템 시간 관리 및 작업 스케줄링
소개
Oracle Linux는 사용자에게 시간 및 날짜와 상호 작용할 수 있는 여러 가지 방법을 제공합니다. 이러한 항목을 수동으로 변경할 수 있지만 chrony와 같이 NTP(Network Time Protocol)를 구현하는 서비스를 구성하는 것이 더 일반적입니다. 이렇게 하면 시스템 시간이 올바르게 유지되고 cron
또는 systemd timers
를 사용하는 모든 작업이 일정에 따라 실행됩니다.
목표
이 자습서에서는 다음 내용을 학습합니다.
date
,hwclock
및timedatectl
를 사용하여 터미널에서 시스템 시간을 관리합니다.- chrony 서비스 실행 및 사용
- cron 및 systemd timers로 작업 일정 잡기
필요 조건
-
최소 단일 Oracle Linux 시스템
-
각 시스템에는 다음과 같이 Oracle Linux가 설치 및 구성되어 있어야 합니다.
- sudo 액세스 권한이 있는 비루트 사용자 계정
- 인터넷에 대한 액세스
Oracle Linux 배치
주: 고유 테넌시에서 실행 중인 경우 linux-virt-labs
GitHub 프로젝트 README.md를 읽고 실습 환경을 배치하기 전에 필요 조건을 완료하십시오.
-
루나 데스크탑에서 터미널을 엽니다.
-
linux-virt-labs
GitHub 프로젝트를 복제합니다.git clone https://github.com/oracle-devrel/linux-virt-labs.git
-
작업 디렉토리로 변경합니다.
cd linux-virt-labs/ol
-
필요한 모음을 설치합니다.
ansible-galaxy collection install -r requirements.yml
-
lab 환경을 배치합니다.
ansible-playbook create_instance.yml -e localhost_python_interpreter="/usr/bin/python3.6"
무료 실습 환경에는 localhost에서 실행되는 재생에 대해
ansible_python_interpreter
를 설정하는 추가 변수local_python_interpreter
이 필요합니다. 이 변수는 환경이 python3.6 모듈 아래에 있는 Oracle Cloud Infrastructure SDK for Python용 RPM 패키지를 설치하기 때문에 필요합니다.기본 배치 구성은 AMD CPU 및 Oracle Linux 8을 사용합니다. Intel CPU 또는 Oracle Linux 9를 사용하려면 배치 명령에
-e instance_shape="VM.Standard3.Flex"
또는-e os_version="9"
를 추가합니다.중요: 플레이북이 성공적으로 실행될 때까지 기다렸다가 일시 중지 작업에 도달합니다. 플레이북의 이 단계에서 Oracle Linux 설치가 완료되고 인스턴스가 준비됩니다. 이전 플레이에서 배치하는 노드의 공용(public) 및 전용(private) IP 주소와 실습을 실행하는 동안 필요한 기타 배치 정보를 출력합니다.
시스템 일자 및 시간 구성합니다.
Oracle Linux에는 시스템의 날짜와 시간을 조정하는 데 도움이 되는 세 가지 일반적인 명령이 있습니다. date
명령은 시스템 시간을 조정하고, hwclock
는 RTC 시간을 조정합니다. Oracle Linux에서 RTC 시간은 시스템의 전원이 꺼졌을 때 계속 실행되는 배터리 지원 하드웨어 시계인 RTC(실시간 시계)가 보관하는 시간을 나타냅니다. 하드웨어 시계의 다른 일반적인 이름에는 CMOS 시계 또는 BIOS 시계가 포함됩니다. date
변경 후 RTC 시계를 업데이트하려면 hwclock
를 실행해야 합니다.
세번째 옵션은 timedatectl
입니다. 이 명령은 date
및 hwclock
를 결합하고 시간을 설정할 때 시스템과 RTC를 모두 업데이트합니다. Oracle Linux와 같은 최신 시스템 기반 Linux 배포판에서는 timedatectl
를 사용하는 것이 좋습니다.
시스템 시계 표시 및 설정
-
터미널을 열고 SSH를 통해 ol-node-01 인스턴스에 연결합니다.
ssh oracle@<ip_address_of_instance>
-
현재 시스템 시간 및 날짜를 가져옵니다.
date
출력에는 시스템의 날짜, 시간 및 시간대가 기본 형식으로 표시됩니다.
date
명령의 많은 인수를 사용하여 출력 형식을 변경할 수 있습니다. 이러한 인수는 서로 다른 날짜 및 시간을 스크립팅하거나 계산할 때 유용합니다.date --help
를 실행하여 자세한 정보를 찾거나man date
를 사용하여 수동 페이지를 봅니다. -
시스템 시간 및 날짜를 조정합니다.
sudo date -s "1 JAN 1970 16:00:00"
-
형식 제어 인수를 사용하여 형식을 단순화합니다.
sudo date +%Y%m%d -s "20250203"
시간을 제공하지 않았으므로 시간 부분은 기본적으로 자정인 모든 0으로 설정됩니다.
-
시스템 시간을 설정합니다.
sudo date +%T -s "14:08:14"
date
명령을 다시 실행하는 경우 입력한 내용에 따라 시간이 표시되어야 합니다.
하드웨어 시계 표시 및 설정
-
현재 하드웨어 시계(RTC)를 읽습니다.
sudo hwclock --show
-
하드웨어 시계를 기반으로 시스템 시계를 설정합니다.
sudo hwclock -s
이 명령을 사용하면
-w
함수를 전달하여 시계를 반대 방향으로 설정할 수 있습니다.hwclock --help
를 실행하거나 수동 페이지man hwclock
를 확인하여 추가 기능과 옵션을 확인하십시오.
Systemd를 사용한 날짜 및 시간
-
현재 날짜 및 시간을 가져옵니다.
timedatectl
사용 가능한 랩 환경의 출력은 NTP 서비스가 활성임을 보여줍니다.
timedatectl
를 사용하여 날짜 및 시간 설정을 수동으로 조정하려면 먼저 사용 안함으로 설정해야 합니다. -
NTP 동기화를 사용 안함으로 설정합니다.
sudo timedatectl set-ntp no
-
날짜 및 시간을 설정합니다.
sudo timedatectl set-time '2014-09-23 14:10:40'
-
날짜 및 시간을 확인합니다.
date
-
시간대 목록을 가져옵니다.
timedatectl list-timezones
q
키를 눌러timedatectl
명령을 종료합니다. -
시간대를 설정합니다.
sudo timedatectl set-timezone 'America/Chicago'
-
새 시간대를 확인합니다.
timedatectl
-
시간대를 UTC(협정 세계시)로 되돌립니다.
sudo timedatectl set-timezone 'UTC'
-
NTP 동기화를 사용으로 설정합니다.
sudo timedatectl set-ntp yes
시간이 지나면 동기화가 수행되고 시계가 설정된 시간대를 기준으로 현재 날짜 및 시간으로 돌아갑니다.
Chrony 사용
ynchrony는 NTP를 구현하여 네트워크에서 시간 기록을 정확하게 유지하고 chronyd
및 chronyc
의 두 구성 요소로 구성된 Oracle Linux의 기능입니다. chronyd
는 부트 시 사용으로 설정 및 시작할 수 있는 서비스 데몬이고, chronyc
는 chronyd
의 성능을 모니터하고 런타임 매개변수를 수정하는 데 사용되는 명령줄 유틸리티입니다.
-
chrony가 설치되어 있는지 확인합니다.
dnf list chrony
설치되지 않은 경우
sudo dnf install -y chrony
를 사용하여 설치할 수 있습니다. -
서비스 데몬의 상태를 확인합니다.
sudo systemctl status chronyd
비활성 상태인 경우
sudo systemctl enable --now chronyd
를 사용하여 서비스를 사용으로 설정하고 시작합니다.q
키를 눌러systemctl
명령을 종료합니다. -
시스템 시계 성능에 대한 정보를 가져옵니다.
chronyc -n tracking
출력 예:
Reference ID : A9FEA9FE (169.254.169.254) Stratum : 3 Ref time (UTC) : Mon Feb 03 16:07:59 2025 System time : 0.000009410 seconds slow of NTP time Last offset : -0.000011537 seconds RMS offset : 0.000015202 seconds Frequency : 22.818 ppm slow Residual freq : -0.004 ppm Skew : 0.222 ppm Root delay : 0.000643811 seconds Root dispersion : 0.000107666 seconds Update interval : 64.4 seconds Leap status : Normal
설명:
- 참조 ID: 컴퓨터가 현재 동기화되어 있는 서버의 참조 ID 및 이름 또는 IP 주소입니다. 출력의 참조 ID는 16진수로 표시됩니다.
- Stratum: 계층은 이 시스템이 연결된 참조 시계가 있는 컴퓨터에서 가져온 홉 수를 나타냅니다.
- 참조 시간: 시스템이 참조 소스에서 마지막 측정을 처리한 시간(UTC)입니다.
man chronyc
를 사용하여 수동 페이지를 확인하면 추가 정보를 확인할 수 있습니다. -
시스템에서 사용하는 소스 목록을 가져옵니다.
chronyc -n sources
-v
옵션을 사용하면 표시된 각 열에 대한 열 설명이 표시됩니다.
태스크 스케줄링
Oracle Linux에는 작업 일정을 잡는 여러 가지 방법이 포함되어 있으며 이러한 작업 또는 작업은 시스템 또는 사용자 레벨에서 실행할 수 있습니다. cron은 이러한 방법 중 가장 잘 알려진 방법일 수 있지만 systemd는 일정 및 단조 시간 예약 측면에서 보다 유연한 타이머를 도입했으며 점점 더 널리 사용되고 있습니다. 현재 Oracle Linux 배포판에는 두 가지가 모두 결합되어 있습니다.
Cron 사용
-
시스템 레벨 cron 작업을 확인합니다.
sudo ls -al /etc/cron*
출력은 미리 결정된 일정(예: hourly, weekly, monthly)에 select 작업을 수행하는 실행 스크립트가 포함된 여러 디렉토리를 제공합니다.
/etc/cron.d
디렉토리도 있습니다. 여기서 패키지는 시스템/etc/crontab
를 수정하지 않고도 crontab 스니펫을 배치할 수 있습니다. -
시스템 레벨 cron 작업 목록을 가져옵니다.
sudo crontab -l
출력은 루트에 대한 crontab이 없음을 나타냅니다.
sudo
없이 동일한 명령을 실행하면 로컬 사용자 계정에 대해 동일한 출력이 제공됩니다. -
사용자 레벨 cron 작업을 만듭니다.
(crontab -l 2>/dev/null; echo '* * * * * date >> /home/oracle/test') | crontab -
첫번째 명령은 입력한 첫번째 작업이므로 no crontab 메시지를 피하고, 두번째 명령은 매분 실행되는 작업을 만듭니다.
-
이제 crontab이 존재하는지 확인합니다.
crontab -l
각 작업은 crontab에서 자체 행에 나타납니다. crontab에는 구성할 수 있는 여러 기간을 정의하는 공백으로 구분된 5개의 필드가 있으며, 그 다음에는 작업이 실행될 명령이 있습니다. 이 명령은 시스템의 명령줄에서 실행할 수 있는 명령과 동일할 수 있으므로 스크립트를 실행하거나 파이프 및 재지정 연산자를 활용할 수 있습니다. 작업을 편집하려면
crontab -e
명령을 사용합니다. 이 명령은 Oracle Linux에서 기본 EDITORvi
로 사용자를 삭제합니다.Crontab 시간 시퀀스 옵션
Crontab은 시간 필드를 다음과 같이 정의합니다.
- 분: 0 ~ 59
- 시간: 0에서 23까지
- 일: 1에서 31까지
- 월: 1부터 12까지 또는 월 이름
- 요일: 0부터 7까지 또는 요일의 약어 이름입니다. 0과 7은 모두 일요일을 나타냅니다.
시간 필드 내에서 특수 문자를 사용할 수 있습니다.
- 별표(*): 필드의 모든 인스턴스에 대해 명령을 실행하도록 지정합니다.
- 하이픈(-): 범위를 나타내는 데 사용할 수 있습니다. 예를 들어 요일 필드에서 월요일부터 금요일까지 태스크가 실행되도록 스케줄링하지만 토요일이나 일요일에 실행되지 않도록 1-5를 지정할 수 있습니다.
- 쉼표(,): 필드의 값 리스트를 지정하는 데 사용할 수 있습니다. 예를 들어, 시간 필드에서 오전 6시와 오후 6시에 작업을 실행하도록 예약하도록 6,18을 지정할 수 있습니다.
- 슬래시(/): 단계 값을 지정하는 데 사용할 수 있습니다. 예를 들어, 분 필드에 */15를 지정하여 15분마다 작업을 실행하도록 예약할 수 있습니다.
또한 crontab에서는 고유한 간단한 확장을 사용하여 일반적인 시간 요구 사항에 대한 시간 필드를 대체할 수 있습니다. 중요하게는 재부트 후 명령을 실행할 수 있는 옵션도 포함되어 있습니다.
- @reboot : 재부팅 후 한 번 실행합니다.
- @yearly : "0 0 1 1 *"와 같이 일년에 한 번 실행합니다.
- @annually : "0 0 1 1 *"와 같이 일년에 한 번 실행합니다.
- @monthly : 한 달에 한 번, 즉 "0 0 1 * *"를 실행합니다.
- @weekly : 일주일에 한 번, 즉 "0 0 * 0"을 실행합니다.
- @daily : 하루에 한 번, 즉 "0 0 * * *"를 실행합니다.
- @hourly : 한 시간에 한 번, 즉 "0 * * * *"를 실행합니다.
crontab은 1분 단위로만 제공됩니다. 작업을 세밀하게 제어해야 하는 경우 systemd 타이머를 사용하는 것이 좋습니다.
예를 들면 다음과 같습니다.
*/15 * * * * echo "This crontab entry runs every 15 minutes" 10 * * * * echo "This crontab entry runs at 10 minutes past every hour" 30 13 * * 3 echo "This crontab entry runs at 13h30 on every Wednesday" @reboot echo "This command runs once after a reboot event"
-
cron 출력을 확인합니다.
sudo tail /var/log/cron
출력에는 날짜, 시간, 사용자 및 명령 실행이 표시됩니다. Oracle Linux의 기본 최소 설치는 MTA(메일 전송 에이전트)를 설치하지 않으므로 cron 데몬은 crontab에 지정된 명령에서 Syslog 데몬으로 출력을 지시합니다. 따라서 로그 파일(
/var/log/cron
)에서 crontab 출력을 볼 수 있습니다.Crontab 명령 구문
crontab은 crontab이 속한 사용자의 자격 증명으로 실행되며 다음과 같은 일부 기본 환경 변수 세트로 실행됩니다.
- HOME: crontab이 실행되는 사용자의 홈 디렉토리
- LOGNAME: crontab이 실행되는 사용자의 사용자 이름과 동일합니다.
- USER: crontab이 실행되는 사용자의 사용자 이름입니다.
- SHELL: 시스템에서 명령을 실행하는 데 사용하는 셸 바이너리입니다. 이 값은 기본적으로
/bin/sh
로 설정됩니다. - PATH: crontab 유틸리티에서 사용할 수 있는 경로입니다. 이 값은 기본적으로
/usr/bin:/bin
로 설정됩니다.
시간 필드를 포함하지 않는 crontab 내의 행으로 지정하여 대체 환경 변수를 설정할 수 있습니다. 예를 들어, bash 셸을 사용하고 개인
.bashrc
구성 내의 모든 변수와 설정을 정기적으로 가져오려는 경우crontab -e
를 사용하여 crontab을 다음과 같이 편집할 수 있습니다.SHELL=/bin/bash * * * * * source $HOME/.bashrc;
crontab 작업의 명령은 셸 환경 내에서 실행되므로 표준 셸 구문이 적용되고 출력을 파이프 또는 재지정하는 데 사용될 수 있습니다. 예를 들어, 모든 출력을 /dev/null로 재지정하려면 명령의 STDOUT 및 STDERR 출력에 대해 표준 셸 재지정을 사용합니다.
* * * * * /path/to/command > /dev/null 2>&1
또는 명령을 실행할 때마다 출력을 추적하는 데 사용할 수 있는 파일에 추가하도록 출력을 재지정할 수 있습니다.
* * * * * /path/to/command >> $HOME/command.log
예를 들면 다음과 같습니다.
*/15 * * * * echo "This 'silent' crontab entry runs every 15 minutes but the output is redirected to /dev/null" > /dev/null 2>&1 * * * * * echo "The date and time is $(date +\%Y-\%m-\%d\ \%H:\%M:\%S)" >> $HOME/crontab.log
예제에서는 crontab 유틸리티를 통해
%
문자가 줄바꿈 문자로 변경되고 첫 번째%
이후의 모든 데이터가 표준 입력으로 명령으로 전송되므로 date 명령에서%
문자를 이스케이프합니다. 자세한 내용은man 5 crontab
을 참조하십시오.
Crontab 파일 제거
특정 작업만 제거하려는 경우 crontab -e
명령을 사용하여 해당 작업이 포함된 개별 행을 편집하고 제거할 수 있습니다. 그러나 모든 작업을 제거하려는 경우 crontab
는 빠르고 효율적인 옵션을 제공합니다.
-
모든 cron 작업 항목을 제거합니다.
crontab -r
Systemd 타이머
cron 작업과 마찬가지로 systemd 타이머를 사용하면 특정 시간에 명령 또는 스크립트를 실행할 수 있습니다. 그러나 이러한 작업은 systemd에 의해 제어되고 감독되며 시간 기반 활성화에 대해 보다 세밀하게 제어할 수 있습니다.
-
기존 타이머를 나열합니다.
systemctl status *timer
q
키를 눌러systemctl
명령을 종료합니다.
타이머 생성
타이머는 수행할 작업을 정의하는 서비스 단위와 스케줄링 및 트리거할 타이머 단위로 구성됩니다. 이러한 서비스는 systemd 서비스 단위이므로 시스템 또는 사용자 공간에 만들 수 있습니다. 사용자 공간의 이점은 사용자가 데몬 및 자동화된 작업과 같은 서비스를 관리할 수 있다는 것입니다.
-
로컬 사용자의 systemd 디렉토리를 만듭니다.
mkdir -p ~/.config/systemd/user
시스템 수준의 서비스 단위 및 타이머는
/etc/systemd/system
로 이동합니다. -
현재 사용자에 대해 링거링을 사용으로 설정합니다.
loginctl enable-linger $(whoami)
링거링은 사용자가 세션에서 로그아웃한 후에도 사용자 프로세스가 계속 실행되도록 하는 systemd의 기능을 가리킵니다.
-
사용자의 지체 상태를 확인합니다.
loginctl user-status $(whoami)
q
키를 눌러 loginctl 명령을 종료합니다. -
타이머가 실행되도록 스크립트를 작성합니다.
cat << 'EOF' | tee ~/test.sh > /dev/null #!/bin/bash /usr/bin/echo "test from test.service: $(date)" 2>&1 | tee -a /home/oracle/test.log EOF
-
스크립트를 실행 가능한 상태로 만듭니다.
chmod +x ~/test.sh
-
서비스 단위를 만듭니다.
cat << EOF | tee ~/.config/systemd/user/test.service > /dev/null [Unit] Description=Run the test script StartLimitIntervalSec=1 StartLimitBurst=10 [Service] Type=oneshot ExecStart=/home/oracle/test.sh StandardOutput=journal SyslogIdentifier=test EOF
이 서비스는 몇 초마다 이 서비스를 실행하기 위한 것이므로
StartLimitIntervalSec
및StartLimitBurst
가 필요합니다. 이러한 매개변수에 대한 자세한 내용은man systemd.unit
에서 확인할 수 있습니다. -
타이머 단위를 생성합니다.
cat << EOF | tee ~/.config/systemd/user/test.timer > /dev/null [Unit] Description=Run test.service every 10 seconds [Timer] OnCalendar=*:*:0/10 AccuracySec=1 Persistent=true [Install] WantedBy=timers.target EOF
systemd 타이머는 요청 시 정확히 실행되지 않지만 기본 차이인 1분으로 작동하므로
AccuracySec
매개변수가 필요합니다. -
systemd가 변경 사항을 인식하도록 합니다.
systemctl --user daemon-reload
-
타이머를 사용으로 설정하고 시작합니다.
systemctl --user enable --now test.timer
-
타이머가 실행 중인지 확인합니다.
systemctl --user status test.timer --no-pager
--no-pager
옵션은 항목을 스크롤하거나 페이지를 이동할 필요 없이 전체 출력을 인쇄합니다. 추가 옵션은systemctl --help
를 참조하십시오. -
bash 스크립트의 로그 파일을 확인합니다.
cat ~/test.log
-
systemd 저널을 확인합니다.
journalctl -r -n 10 --user-unit test --no-pager
이 출력은 사용자의 test.service systemd 단위에서 가져온 마지막 10줄의 출력을 보여줍니다.
-r
옵션은 분개 입력을 역시간순으로 표시합니다.journalctl -r -n 10 -t test --no-pager
이 명령은 systemd 서비스 단위에서 실행한 스크립트에 의해 생성된 출력을 보여줍니다.
-t
옵션은 검색할 식별자를 제공하는test.service
파일에 정의된SyslogIdentifier
와 일치합니다.man journalctl
페이지를 읽고journalctl
에 대한 추가 옵션을 참조하십시오. -
타이머를 사용 안함으로 설정합니다.
systemctl --user disable test.timer
이 명령은 나중에 타이머가 자동으로 시작되지 않도록 하고 비활성 상태로 만듭니다.
-
타이머를 중지합니다.
systemctl --user stop test.timer
이 명령은 타이머가 실행 중인 경우 현재 실행을 중지합니다. 타이머가 나중에 다시 시작하는 것을 막지는 않습니다.
다음 단계
이 자습서를 완료하면 Oracle Linux에서 날짜, 시간 및 일정 작업을 관리하는 기술과 능력을 입증할 수 있습니다. 표시된 명령의 플래그와 기능이 더 많습니다. 아래 링크와 권장 매뉴얼 페이지를 확인하여 지식과 기술을 향상시키십시오.
관련 링크
추가 학습 자원
docs.oracle.com/learn에서 다른 랩을 탐색하거나 Oracle Learning YouTube 채널에서 더 많은 무료 학습 콘텐츠에 액세스하세요. 또한 education.oracle.com/learning-explorer를 방문하여 Oracle Learning Explorer가 되십시오.
제품 설명서는 Oracle Help Center를 참조하십시오.
Manage System Time and Schedule Tasks on Oracle Linux
F49760-05