주:

Oracle Linux에서 시스템 시간 관리 및 작업 스케줄링

소개

Oracle Linux는 사용자에게 시간 및 날짜와 상호 작용할 수 있는 여러 가지 방법을 제공합니다. 이러한 항목을 수동으로 변경할 수 있지만 chrony와 같이 NTP(Network Time Protocol)를 구현하는 서비스를 구성하는 것이 더 일반적입니다. 이렇게 하면 시스템 시간이 올바르게 유지되고 cron 또는 systemd timers를 사용하는 모든 작업이 일정에 따라 실행됩니다.

목표

이 자습서에서는 다음 내용을 학습합니다.

필요 조건

Oracle Linux 배치

주: 고유 테넌시에서 실행 중인 경우 linux-virt-labs GitHub 프로젝트 README.md를 읽고 실습 환경을 배치하기 전에 필요 조건을 완료하십시오.

  1. 루나 데스크탑에서 터미널을 엽니다.

  2. linux-virt-labs GitHub 프로젝트를 복제합니다.

    git clone https://github.com/oracle-devrel/linux-virt-labs.git
    
  3. 작업 디렉토리로 변경합니다.

    cd linux-virt-labs/ol
    
  4. 필요한 모음을 설치합니다.

    ansible-galaxy collection install -r requirements.yml
    
  5. 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입니다. 이 명령은 datehwclock를 결합하고 시간을 설정할 때 시스템과 RTC를 모두 업데이트합니다. Oracle Linux와 같은 최신 시스템 기반 Linux 배포판에서는 timedatectl를 사용하는 것이 좋습니다.

시스템 시계 표시 및 설정

  1. 터미널을 열고 SSH를 통해 ol-node-01 인스턴스에 연결합니다.

    ssh oracle@<ip_address_of_instance>
    
  2. 현재 시스템 시간 및 날짜를 가져옵니다.

    date
    

    출력에는 시스템의 날짜, 시간 및 시간대가 기본 형식으로 표시됩니다. date 명령의 많은 인수를 사용하여 출력 형식을 변경할 수 있습니다. 이러한 인수는 서로 다른 날짜 및 시간을 스크립팅하거나 계산할 때 유용합니다. date --help를 실행하여 자세한 정보를 찾거나 man date를 사용하여 수동 페이지를 봅니다.

  3. 시스템 시간 및 날짜를 조정합니다.

    sudo date -s "1 JAN 1970 16:00:00"
    
  4. 형식 제어 인수를 사용하여 형식을 단순화합니다.

    sudo date +%Y%m%d -s "20250203"
    

    시간을 제공하지 않았으므로 시간 부분은 기본적으로 자정인 모든 0으로 설정됩니다.

  5. 시스템 시간을 설정합니다.

    sudo date +%T -s "14:08:14"
    

    date 명령을 다시 실행하는 경우 입력한 내용에 따라 시간이 표시되어야 합니다.

하드웨어 시계 표시 및 설정

  1. 현재 하드웨어 시계(RTC)를 읽습니다.

    sudo hwclock --show
    
  2. 하드웨어 시계를 기반으로 시스템 시계를 설정합니다.

    sudo hwclock -s
    

    이 명령을 사용하면 -w 함수를 전달하여 시계를 반대 방향으로 설정할 수 있습니다. hwclock --help를 실행하거나 수동 페이지 man hwclock를 확인하여 추가 기능과 옵션을 확인하십시오.

Systemd를 사용한 날짜 및 시간

  1. 현재 날짜 및 시간을 가져옵니다.

    timedatectl
    

    사용 가능한 랩 환경의 출력은 NTP 서비스활성임을 보여줍니다. timedatectl를 사용하여 날짜 및 시간 설정을 수동으로 조정하려면 먼저 사용 안함으로 설정해야 합니다.

  2. NTP 동기화를 사용 안함으로 설정합니다.

    sudo timedatectl set-ntp no
    
  3. 날짜 및 시간을 설정합니다.

    sudo timedatectl set-time '2014-09-23 14:10:40'
    
  4. 날짜 및 시간을 확인합니다.

    date
    
  5. 시간대 목록을 가져옵니다.

    timedatectl list-timezones
    

    q 키를 눌러 timedatectl 명령을 종료합니다.

  6. 시간대를 설정합니다.

    sudo timedatectl set-timezone 'America/Chicago'
    
  7. 새 시간대를 확인합니다.

    timedatectl
    
  8. 시간대를 UTC(협정 세계시)로 되돌립니다.

    sudo timedatectl set-timezone 'UTC'
    
  9. NTP 동기화를 사용으로 설정합니다.

    sudo timedatectl set-ntp yes
    

    시간이 지나면 동기화가 수행되고 시계가 설정된 시간대를 기준으로 현재 날짜 및 시간으로 돌아갑니다.

Chrony 사용

ynchrony는 NTP를 구현하여 네트워크에서 시간 기록을 정확하게 유지하고 chronydchronyc의 두 구성 요소로 구성된 Oracle Linux의 기능입니다. chronyd는 부트 시 사용으로 설정 및 시작할 수 있는 서비스 데몬이고, chronycchronyd의 성능을 모니터하고 런타임 매개변수를 수정하는 데 사용되는 명령줄 유틸리티입니다.

  1. chrony가 설치되어 있는지 확인합니다.

    dnf list chrony
    

    설치되지 않은 경우 sudo dnf install -y chrony를 사용하여 설치할 수 있습니다.

  2. 서비스 데몬의 상태를 확인합니다.

    sudo systemctl status chronyd
    

    비활성 상태인 경우 sudo systemctl enable --now chronyd를 사용하여 서비스를 사용으로 설정하고 시작합니다. q 키를 눌러 systemctl 명령을 종료합니다.

  3. 시스템 시계 성능에 대한 정보를 가져옵니다.

    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를 사용하여 수동 페이지를 확인하면 추가 정보를 확인할 수 있습니다.

  4. 시스템에서 사용하는 소스 목록을 가져옵니다.

    chronyc -n sources
    

    -v 옵션을 사용하면 표시된 각 열에 대한 열 설명이 표시됩니다.

태스크 스케줄링

Oracle Linux에는 작업 일정을 잡는 여러 가지 방법이 포함되어 있으며 이러한 작업 또는 작업은 시스템 또는 사용자 레벨에서 실행할 수 있습니다. cron은 이러한 방법 중 가장 잘 알려진 방법일 수 있지만 systemd는 일정 및 단조 시간 예약 측면에서 보다 유연한 타이머를 도입했으며 점점 더 널리 사용되고 있습니다. 현재 Oracle Linux 배포판에는 두 가지가 모두 결합되어 있습니다.

Cron 사용

  1. 시스템 레벨 cron 작업을 확인합니다.

    sudo ls -al /etc/cron*
    

    출력은 미리 결정된 일정(예: hourly, weekly, monthly)에 select 작업을 수행하는 실행 스크립트가 포함된 여러 디렉토리를 제공합니다. /etc/cron.d 디렉토리도 있습니다. 여기서 패키지는 시스템 /etc/crontab를 수정하지 않고도 crontab 스니펫을 배치할 수 있습니다.

  2. 시스템 레벨 cron 작업 목록을 가져옵니다.

    sudo crontab -l
    

    출력은 루트에 대한 crontab이 없음을 나타냅니다. sudo 없이 동일한 명령을 실행하면 로컬 사용자 계정에 대해 동일한 출력이 제공됩니다.

  3. 사용자 레벨 cron 작업을 만듭니다.

    (crontab -l 2>/dev/null; echo  '* * * * * date >> /home/oracle/test') | crontab -
    

    첫번째 명령은 입력한 첫번째 작업이므로 no crontab 메시지를 피하고, 두번째 명령은 매분 실행되는 작업을 만듭니다.

  4. 이제 crontab이 존재하는지 확인합니다.

    crontab -l
    

    각 작업은 crontab에서 자체 행에 나타납니다. crontab에는 구성할 수 있는 여러 기간을 정의하는 공백으로 구분된 5개의 필드가 있으며, 그 다음에는 작업이 실행될 명령이 있습니다. 이 명령은 시스템의 명령줄에서 실행할 수 있는 명령과 동일할 수 있으므로 스크립트를 실행하거나 파이프 및 재지정 연산자를 활용할 수 있습니다. 작업을 편집하려면 crontab -e 명령을 사용합니다. 이 명령은 Oracle Linux에서 기본 EDITOR vi로 사용자를 삭제합니다.

    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"
    
  5. 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는 빠르고 효율적인 옵션을 제공합니다.

  1. 모든 cron 작업 항목을 제거합니다.

    crontab -r
    

Systemd 타이머

cron 작업과 마찬가지로 systemd 타이머를 사용하면 특정 시간에 명령 또는 스크립트를 실행할 수 있습니다. 그러나 이러한 작업은 systemd에 의해 제어되고 감독되며 시간 기반 활성화에 대해 보다 세밀하게 제어할 수 있습니다.

  1. 기존 타이머를 나열합니다.

    systemctl status *timer
    

    q 키를 눌러 systemctl 명령을 종료합니다.

타이머 생성

타이머는 수행할 작업을 정의하는 서비스 단위와 스케줄링 및 트리거할 타이머 단위로 구성됩니다. 이러한 서비스는 systemd 서비스 단위이므로 시스템 또는 사용자 공간에 만들 수 있습니다. 사용자 공간의 이점은 사용자가 데몬 및 자동화된 작업과 같은 서비스를 관리할 수 있다는 것입니다.

  1. 로컬 사용자의 systemd 디렉토리를 만듭니다.

    mkdir -p ~/.config/systemd/user
    

    시스템 수준의 서비스 단위 및 타이머는 /etc/systemd/system로 이동합니다.

  2. 현재 사용자에 대해 링거링을 사용으로 설정합니다.

    loginctl enable-linger $(whoami)
    

    링거링은 사용자가 세션에서 로그아웃한 후에도 사용자 프로세스가 계속 실행되도록 하는 systemd의 기능을 가리킵니다.

  3. 사용자의 지체 상태를 확인합니다.

    loginctl user-status $(whoami)
    

    q 키를 눌러 loginctl 명령을 종료합니다.

  4. 타이머가 실행되도록 스크립트를 작성합니다.

    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
    
  5. 스크립트를 실행 가능한 상태로 만듭니다.

    chmod +x ~/test.sh
    
  6. 서비스 단위를 만듭니다.

    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
    

    이 서비스는 몇 초마다 이 서비스를 실행하기 위한 것이므로 StartLimitIntervalSecStartLimitBurst가 필요합니다. 이러한 매개변수에 대한 자세한 내용은 man systemd.unit에서 확인할 수 있습니다.

  7. 타이머 단위를 생성합니다.

    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 매개변수가 필요합니다.

  8. systemd가 변경 사항을 인식하도록 합니다.

    systemctl --user daemon-reload
    
  9. 타이머를 사용으로 설정하고 시작합니다.

    systemctl --user enable --now test.timer
    
  10. 타이머가 실행 중인지 확인합니다.

    systemctl --user status test.timer --no-pager
    

    --no-pager 옵션은 항목을 스크롤하거나 페이지를 이동할 필요 없이 전체 출력을 인쇄합니다. 추가 옵션은 systemctl --help를 참조하십시오.

  11. bash 스크립트의 로그 파일을 확인합니다.

    cat ~/test.log
    
  12. 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에 대한 추가 옵션을 참조하십시오.

  13. 타이머를 사용 안함으로 설정합니다.

    systemctl --user disable test.timer
    

    이 명령은 나중에 타이머가 자동으로 시작되지 않도록 하고 비활성 상태로 만듭니다.

  14. 타이머를 중지합니다.

    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를 참조하십시오.