전제조건

전제조건

매일 자정에 Python 스크립트를 시작해야 하는데, 인터넷에서 검색을 좀 한 후 cron을 사용할 수 있다는 것을 알게 되었습니다. 제가 궁금한 점은 자정에 cron 작업을 예약하면 작업을 수행하기 위해 컴퓨터가 깨어나는 것입니다. 아니면 다른 방법을 사용하여 컴퓨터를 깨워야 합니까? 우분투 16.04를 사용하고 있습니다.

답변1

짧은 답변:

아니요.

~할 수 있다그러나 사용rtcwake. 를 사용하면 rtcwake컴퓨터를 깨우고 나중에 명령과 스크립트를 실행하도록 설정할 수 있습니다.

옵션에는 절대 시간에 기상하는 것과 특정 시간 범위에 기상하는 것이 모두 포함됩니다.지금부터:

-s seconds | --seconds seconds
    Sets the wakeup time to seconds in future from now. 
-t time_t | --time time_t
    Sets the wakeup time to the absolute time time_t. time_t is the time in seconds since 1970-01-01, 00:00 UTC. Use the 

rtcwake를 사용하는 방법의 예는 다음과 같습니다.이 답변.
또한 언제나처럼,man rtcwake

답변2

이 목적으로 사용할 수 있다는 답변이 이미 있습니다 rtcwake. 이에 대해 좀 더 자세히 설명하고 싶습니다.어떻게할 수 있어요.

전제조건

먼저 rtcwake(패키지에서 util-linux) 설치 dmidecode하고 다음을 수행합니다 anacron.

sudo apt install util-linux dmidecode anacron

컴퓨터가 대기 모드에서 깨어날 수 있는지 확인하십시오.

sudo rtcwake -m mem -s 30

이렇게 하면 컴퓨터가 대기 모드로 전환되고 30초 후에 깨어납니다. (컴퓨터를 일시 중지하거나 최대 절전 모드로 전환하는 데 시간이 걸릴 수 있고, 깨우기 시간이 대기 프로세스 종료보다 일찍 종료되면 깨우기가 작동하지 않을 수 있으므로 30초를 선택했습니다.)

이외의 다른 대기 방법을 시도해 볼 수 있습니다 mem. disk특히 절전 효과가 더 크지만 암호화된 시스템은 비밀번호를 수동으로 제공하지 않으면 이 방법에서 다시 시작할 수 없습니다.

컴퓨터가 성공적으로 깨어나면 깨어난 이유를 확인할 수 있는지 확인하십시오.

sudo dmidecode | grep "Wake-up Type"

Wake-up Type: APM Timer출력에 표시되면 진행하는 것이 좋습니다.

일시 중단을 위한 사용자 정의 스크립트

모든 전제 조건이 충족되면 다음을 수행하는 간단한 스크립트를 구성할 수 있습니다.

  • 절전 모드 해제 시간을 설정하는 동안 컴퓨터도 일시 중지합니다.
  • 기상 후 기상이 예약되었는지 수동으로 이루어졌는지 확인합니다.
  • 깨우기가 예약된 경우 cron 작업을 실행하고 컴퓨터를 다시 대기 모드로 전환하여 새 깨우기를 설정합니다.

스크립트는 다음과 같습니다.

#! /bin/bash
# https://askubuntu.com/a/1323317
while true
do
  wake_at=22:05 # Set to whenever you want the cron jobs to run each day
  wake_ts="$(date -d "$wake_at" +%s)"
  now_ts="$(date +%s)"
  if [ "$wake_ts" -lt "$now_ts" ]
  then
    wake_ts="$(date -d "tomorrow $wake_at" +%s)"
  fi
  rtcwake -m mem -t "$wake_ts"

  # After wake-up
  #
  # Without this sleep, the current time would still seem to be the instant when
  # the suspend happened, confusing man and machine alike.
  sleep 1
  if dmidecode | grep -q "Wake-up Type: APM Timer"
  then
    # We trigger anacron manually. To prevent cron jobs from running during
    # active uptime, its systemd triggers need to be disabled.
    /usr/sbin/anacron -nd
  else
    exit 0
  fi
done

이 스크립트는 루트로 실행해야 하므로 루트 사용자를 소유자로 설정하고 사용하여 sudo시작하는 것이 좋습니다. sudoers 메커니즘을 사용하면 비밀번호를 입력하지 않고도 실행할 수 있지만, 이미 많은 가이드에 설명되어 있으므로 여기서는 자세히 설명하지 않겠습니다.

이 메커니즘을 더 쉽게 사용하려면 데스크탑 환경에서 단축키를 설정하는 것이 좋습니다. 그렇게 하는 경우 데스크탑 환경별 화면 보호기 명령이 로 위의 스크립트를 실행하기 전에 화면을 잠그도록 지시하는 래퍼 스크립트를 사용해야 합니다 sudo.

일반 일정 비활성화

크론 작업을 원하는 경우오직컴퓨터의 활성 가동 시간이 아닌 예정된 깨우기 시간에 실행하려면 기존 일정을 비활성화해야 합니다. Ubuntu에서 cron 작업은 디렉터리로 구성되지만 해당 디렉터리는 다음의 하위 수준 작업에 의해 실행됩니다 /etc/crontab.

25 6    * * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6    * * 7   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6    1 * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )

매일, 매주, 매월 작업을 실행하는 crontab 항목은 anacron이 설치되지 않은 경우에만 실행된다는 것을 알 수 있습니다(그렇지 않은 경우 anacron이 해당 작업 실행 작업을 대신한다는 의도로). 방금 anacron을 설치했으므로 cron은 더 이상 이러한 작업을 자동으로 실행하지 않지만 anacron은 비활성화해야 합니다.

Anacron 자체도 systemd에 의해 트리거되는 예약된 작업입니다. 비활성화하려면 다음을 실행하십시오.

sudo systemctl mask --now anacron.service
sudo systemctl mask --now anacron.timer

대신에 충분할 수도 mask있지만 disable인터넷에서 이에 대한 상충되는 정보를 찾았지만mask 5월패키지 업그레이드로 인해 비활성화된 항목이 다시 활성화되는 것을 방지하는 데 도움이 됩니다.

이 작업이 완료되면 일별, 주별 및 월별 크론 작업은 컴퓨터의 정상적인 가동 시간 동안 실행되지 않고 위에 제공된 일시 중지 스크립트에 의해서만 실행되고 예정된 깨우기 후에만 실행됩니다.

관련 정보