crontab의 시간대를 어떻게 설정합니까?


63

노트북이 매일 아침 특정 시간에 깨우도록 ACPI 깨우기를 설정했습니다. 이에 대한 시간대는 UTC입니다. UTC를 사용하여 crontab을 설정하여 깨우기 경보에 적합하도록 설정하고 싶습니다.

어떻게합니까?

/etc/default/cron다음을 포함하도록 편집 을 시도했습니다 .

TZ="UTC"

그러나 작동하지 않습니다. (나는 또한 시도했다 TZ=UTCTZ="UTC/GMT")

어떤 아이디어?


1
sudo service cron restart편집 후 했어요 ?
Rinzwind

1
아니요 ...하지만 시도했지만 차이가 없었습니다.
alj


답변:


44

Trusty (14.04)와 비슷한 문제가있었습니다. 기기의 시간대를 설정하고 cron서비스 를 다시 시작하여 문제를 해결했습니다.

  1. sudo dpkg-reconfigure tzdata -지침에 따라 지역 / 국가를 선택하십시오.
  2. sudo service cron restart

1
시간대를 설정 한 후 date명령 행에 입력 하여 예상대로 날짜가 올바른지 확인할 수 있습니다.
mydoghasworms 2014 년

cron을 다시 시작했지만 여전히 기존 시간대 (UTC)를 사용하고 있습니까?
Luke Fisk-Lennon

이것은 18.10에서 완벽하게 작동했습니다. ~ $ 날짜는 정확한 시간을 반환합니다. 밝은 색상의 DOS 스타일 GUI 인터페이스를 좋아합니다! 감사.
itsricky

18

이것을 달성하는 쉬운 방법은 없습니다. cron은 현지 시간을 사용합니다. crontab의 /etc/default/cron다른 TZ사양은 TZcron이 시작한 프로세스에 사용해야 할 것을 지정 합니다. 시작 시간에는 영향을 미치지 않습니다.

내가 본 대부분의 솔루션에는 중간에 유틸리티가 포함되어 있으므로 cron은 UTC로 시작해야 할 시점을 결정하는 무언가를 시작합니다 (예를 들어 DST 변경에만 관심이 있다면 2 시간 전에 시작하십시오. 시간 차이, 후 킥오프.에서보세요 at. 이렇게하려면, 사람들은 자주 사용 perl하거나 python) 또는 유사한 스크립트 언어.

원하는 경우 해킹 할 수있는 불쾌한 방법이 있습니다. cron은 시작할 때 시스템에서 TZ 정보 만 읽습니다. 따라서이 서버가 계속 실행중인 서버 인 경우 TZ를 UTC로 설정하고 재부팅 한 다음 부팅 후 로컬 시간대로 설정할 수 있습니다. 이것을 스크립트 할 수도 있습니다.

다른 방법으로, @reboot부팅 후 스크립트를 실행해야하는 cron 구문도 살펴보십시오. 원하는 구문처럼 들립니다.


14

시스템 시간대를 제어하는 ​​파일이 있습니다. 방금 같은 문제가 있습니다. 해결책은 다음과 같습니다.

시간대를 수동으로 구성하지 않은 경우 running date은 UTC 시간을 표시해야합니다.

  • 백업을 만들

    sudo cp /etc/localtime /etc/localtime.bkp
    
  • 파일을 제거하십시오.

    sudo rm /etc/localtime
    
  • 나는 시카고에 살고 있습니다 (탭 키 도움말을 사용하여 경로를 변경해야 할 수도 있음).

    sudo ln -s /usr/share/zoneinfo/America/Chicago /etc/localtime
    
  • 그런 다음 재부팅하십시오. 시스템 시작시 : 날짜

  • 이제 귀하의 시간대가 지금 있어야하며 cron이 이것을 볼 것입니다.

참고 : TZ 변수 설정은 임시 해결책이며 때때로 "마스크"역할을 할 수도 있습니다.


1
CentOS 호환 솔루션 (및 EC2 Amazon Linux)의 경우 +1 완전히 다시 시작하는 것이 좋을지 모르지만 date재부팅하지 않고 작동했으며 OS를 다시 시작하면 sudo service crond restartcron 작업 시간을 수정하기에 충분했습니다.
davur

+1 감사합니다.

13

2017 년 3 월 현재, crond가 각 crontab에서 CRON_TZ 변수를 지원한다는 것을 발견했습니다.

CRON_TZ 변수는 cron 테이블에 특정한 시간대를 지정합니다. 사용자는 지정된 시간대에 따라 시간을 표에 입력해야합니다. 로그 파일에 쓰는 데 사용 된 시간은 데몬이 실행중인 로컬 시간대에서 가져옵니다.

— crontab (5) 매뉴얼 페이지에서 인용

이를 통해 서버가 UTC로 유지되는 동안 자동으로 DST를 설명하는 현지 시간으로 각 cronjob을 실행할 시간을 지정할 수있었습니다.


또한이 링크가 도움이 발견 serverfault.com/questions/848829/...를 . 필요한 시간대 옵션을 찾기 위해 옵션 ls /usr/share/zoneinfo/America을보기 위해 입력 했습니다.
cheevahagadog

7

좋아, 시간이 좀 걸렸고 우분투 Natty 에서이 작업을 수행하는 방법을 알아 냈습니다. 더 우아한 방법이있을 수 있지만이 방법으로 작동합니다.

먼저, CZ 실행 파일을 TZ 변수를 설정하는 쉘로 랩핑해야합니다. 방법은 다음과 같습니다.

cd /usr/sbin
mv cron cron.real

그런 다음 새 / usr / sbin / cron 파일을 작성하십시오. vim을 사용했지만 원하는 편집기를 사용할 수 있습니다. 파일을 다음과 같이 만드십시오.

#!/bin/bash
export TZ=UTC
/usr/sbin/cron.real

새 cron 파일을 실행 가능하게 만드십시오.

chmod ugo+rx cron

이제 cron 데몬을 다시 시작하십시오.

service cron restart

cron 작업은 이제 UTC 기반 스케줄로 실행됩니다. 그러나 실행 시간은 UTC이지만 실행되면 시스템에 대해 정의 된 시간대로 시간대가 설정됩니다. 이를 변경하려면 명령 앞에 crontab에 넣으십시오.

TZ=UTC

그래서 당신의 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
TZ=UTC
00 19 * * * date > /tmp/date.log

1
두 곳에서 TZ = UTC를 설정하는 요점은 무엇입니까? crontab 파일에 넣을 수 없습니까?
Phương Nguyễn

아니요. crontab 파일에 TZ = UTC를 넣으면 cron 자체가 아닌 cron 작업에 대해서만 설정됩니다. 작업 실행 시간에는 영향을 미치지 않습니다.
Mark Reed

5
  1. 참조하십시오 /etc/default/cron. TZ-all- crontab에 대해 여기서 설정할 수 있으며 TZ=UTCiirc 여야합니다 . 그래서 당신의 방법은 효과가 있었을 것입니다.

  2. fcron보십시오 . 다른 시간대에서 개별 crontab을 설정할 수 있습니다.

    timezone-name 'time zone of the system'

    주어진 시간대에서 작업을 실행하십시오. timezone-name은 환경 변수 TZ에 유효한 문자열입니다. 자세한 내용은 시스템 설명서를 참조하십시오. 예를 들어, "유럽 / 파리"는 Linux 시스템에서 유효합니다. 이 옵션은 일광 절약 시간제 변경을 올바르게 처리합니다. 이 옵션을 정의하는 작업이 실행될 때 TZ 환경 변수는 시간대 값으로 설정됩니다.

    잘못된 시간대 이름 인수를 제공하면 자동으로 무시되며 작업은 시스템의 시간대에서 실행됩니다.


글쎄, 그것을 확인했고 crontab은 트리거 시간을 현지 시간으로 설정했을 때만 작동합니다. UTC로 시간을 설정하면 작동하지 않습니다.
alj

잘 4 년 후 나는 / etc / default / cron에있는 파일을 들여다
보았

4 년 후 공감 비? 그렇습니다. 이것은 현재 유효하지 않지만 그날 다시는 아니 었습니다. 그런 다음 다시는 아무도 11.04 사용자가 아닙니다.
Rinzwind

3
이 답변이 유효하지 않으면 아마도 삭제해야합니다. StackExchange에 고의로 잘못된 정보를 유지하는 데는 아무런 의미가 없습니다. 그것은 그 사용 거의 관련이없는 올바른 정보의 검색이 페이지를 방문 사람에게 온 - 주제 및 / 또는 정확합니다.
Quuxplusone 2016 년

4

우분투 전용 솔루션에 대한 다음 게시물 을 참조하십시오

나는 이것이 우분투 포럼이라는 것을 알고 있지만, 답변은 Red Hat 시스템 에서이 작업을 수행하는 방법과 매우 유사하다고 생각합니다. 이것을 테스트하기에 편리한 Ubuntu 시스템은 없지만 Red Hat에서 테스트했습니다.

cron 데몬 init 스크립트에 줄을 추가하기 만하면됩니다. 다음과 같이 환경 변수 TZ를 설정하고 내보내십시오.

export TZ=UTC

그런 다음 cron 데몬을 다시 시작하십시오. 다른 변수 설정 및 소싱 후에이 내보내기를 cron 데몬 시작 스크립트에 넣었는지 확인하십시오. 이것이 원래 포스터의 /etc/default/cron스크립트 편집이 그에게 적합하지 않은 이유 일 수 있습니다 . 어쩌면 그는 그것을 설정했지만 스크립트에서 더 아래로 무언가로 재설정되었습니다.

이것은 cron 데몬 자체에만 영향을 미치며 cron을 통해 실행하는 작업에는 영향을 미치지 않으므로 cron 작업을 UTC로 시간대로 사용하려면 작업 자체에서도 설정해야합니다.

이 그대로의 내용을 복사하여 우분투 상자에서 사용할 수는 없지만 Red Hat에서이를 테스트하는 데 사용한 init 스크립트는 다음과 같습니다. start()함수 직전에 내보내기를 찾을 수 있습니다.

#!/bin/sh
#
# crond          Start/Stop the cron clock daemon.
#
# chkconfig: 2345 90 60
# description: cron is a standard UNIX program that runs user-specified \
#              programs at periodic scheduled times. vixie cron adds a \
#              number of features to the basic UNIX cron, including better \
#              security and more powerful configuration options.

### BEGIN INIT INFO
# Provides: crond crontab
# Required-Start: $local_fs $syslog
# Required-Stop: $local_fs $syslog
# Default-Start:  2345
# Default-Stop: 90
# Short-Description: run cron daemon
# Description: cron is a standard UNIX program that runs user-specified 
#              programs at periodic scheduled times. vixie cron adds a 
#              number of features to the basic UNIX cron, including better 
#              security and more powerful configuration options.
### END INIT INFO

[ -f /etc/sysconfig/crond ] || { 
    [ "$1" = "status" ] && exit 4 || exit 6 
}

RETVAL=0
prog="crond"
exec=/usr/sbin/crond
lockfile=/var/lock/subsys/crond
config=/etc/sysconfig/crond

# Source function library.
. /etc/rc.d/init.d/functions

[ -e /etc/sysconfig/$prog ] && . /etc/sysconfig/$prog

export TZ=UTC
start() {
    if [ $UID -ne 0 ] ; then
        echo "User has insufficient privilege."
        exit 4
    fi
    [ -x $exec ] || exit 5
    [ -f $config ] || exit 6
    echo -n $"Starting $prog: "
    daemon $prog $CRONDARGS
    retval=$?
    echo
    [ $retval -eq 0 ] && touch $lockfile
}

stop() {
    if [ $UID -ne 0 ] ; then
        echo "User has insufficient privilege."
        exit 4
    fi
    echo -n $"Stopping $prog: "
    if [ -n "`pidfileofproc $exec`" ]; then
        killproc $exec
        RETVAL=3
    else
        failure $"Stopping $prog"
    fi
    retval=$?
    echo
    [ $retval -eq 0 ] && rm -f $lockfile
}

restart() {
    stop
    start
}

reload() {
    echo -n $"Reloading $prog: "
    if [ -n "`pidfileofproc $exec`" ]; then
        killproc $exec -HUP
    else
        failure $"Reloading $prog"
    fi
    retval=$?
    echo
}

force_reload() {
    # new configuration takes effect after restart
    restart
}

rh_status() {
    # run checks to determine if the service is running or use generic status
    status -p /var/run/crond.pid $prog
}

rh_status_q() {
    rh_status >/dev/null 2>&1
}


case "$1" in
    start)
        rh_status_q && exit 0
        $1
        ;;
    stop)
        rh_status_q || exit 0
        $1
        ;;
    restart)
        $1
        ;;
    reload)
        rh_status_q || exit 7
        $1
        ;;
    force-reload)
        force_reload
        ;;
    status)
        rh_status
        ;;
    condrestart|try-restart)
        rh_status_q || exit 0
        restart
        ;;
    *)
        echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload}"
        exit 2
esac
exit $?

0

우분투 14/16에서 이것을 알아 냈습니다. 나를 위해 완벽하게 일했습니다.

단계 (Sudo 암시) :

cat /etc/timezone
rm -fv /etc/localtime
ln -s /usr/share/zoneinfo/Asia/Kolkata /etc/localtime
apt install -y --reinstall tzdata
/etc/init.d/rsyslog restart
tail -f /var/log/syslog
cat /etc/timezone

0

쉘 스크립트에서 utc 시간을 평가하는 것은 어떻습니까? 쉘 스크립트가 매시간 실행되도록 스케줄하십시오. 스크립트 맨 위에서 date 명령에서 UTC 시간을 가져옵니다. 원하는 UTC 시간이 아니면 종료하십시오.

이 스크립트는 1am utc가 아닌 경우 종료됩니다.

#!/bin/bash
if [ $(date -u +"%H") != "01" ]; then
 exit 0
fi

0

환경 변수 CRON_TZ를 설정할 수 있습니다 . cron 작업이 원격 서버에서 실행되는 경우 crontab에서 사용하는 쉘이 sh 임을 알 수 있습니다. / etc / crontab을 다시 확인할 수 있습니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.