노트북이 매일 아침 특정 시간에 깨우도록 ACPI 깨우기를 설정했습니다. 이에 대한 시간대는 UTC입니다. UTC를 사용하여 crontab을 설정하여 깨우기 경보에 적합하도록 설정하고 싶습니다.
어떻게합니까?
/etc/default/cron
다음을 포함하도록 편집 을 시도했습니다 .
TZ="UTC"
그러나 작동하지 않습니다. (나는 또한 시도했다 TZ=UTC
과 TZ="UTC/GMT"
)
어떤 아이디어?
노트북이 매일 아침 특정 시간에 깨우도록 ACPI 깨우기를 설정했습니다. 이에 대한 시간대는 UTC입니다. UTC를 사용하여 crontab을 설정하여 깨우기 경보에 적합하도록 설정하고 싶습니다.
어떻게합니까?
/etc/default/cron
다음을 포함하도록 편집 을 시도했습니다 .
TZ="UTC"
그러나 작동하지 않습니다. (나는 또한 시도했다 TZ=UTC
과 TZ="UTC/GMT"
)
어떤 아이디어?
답변:
Trusty (14.04)와 비슷한 문제가있었습니다. 기기의 시간대를 설정하고 cron
서비스 를 다시 시작하여 문제를 해결했습니다.
sudo dpkg-reconfigure tzdata
-지침에 따라 지역 / 국가를 선택하십시오.sudo service cron restart
date
명령 행에 입력 하여 예상대로 날짜가 올바른지 확인할 수 있습니다.
이것을 달성하는 쉬운 방법은 없습니다. cron은 현지 시간을 사용합니다. crontab의 /etc/default/cron
다른 TZ
사양은 TZ
cron이 시작한 프로세스에 사용해야 할 것을 지정 합니다. 시작 시간에는 영향을 미치지 않습니다.
내가 본 대부분의 솔루션에는 중간에 유틸리티가 포함되어 있으므로 cron은 UTC로 시작해야 할 시점을 결정하는 무언가를 시작합니다 (예를 들어 DST 변경에만 관심이 있다면 2 시간 전에 시작하십시오. 시간 차이, 후 킥오프.에서보세요 at
. 이렇게하려면, 사람들은 자주 사용 perl
하거나 python
) 또는 유사한 스크립트 언어.
원하는 경우 해킹 할 수있는 불쾌한 방법이 있습니다. cron은 시작할 때 시스템에서 TZ 정보 만 읽습니다. 따라서이 서버가 계속 실행중인 서버 인 경우 TZ를 UTC로 설정하고 재부팅 한 다음 부팅 후 로컬 시간대로 설정할 수 있습니다. 이것을 스크립트 할 수도 있습니다.
다른 방법으로, @reboot
부팅 후 스크립트를 실행해야하는 cron 구문도 살펴보십시오. 원하는 구문처럼 들립니다.
시스템 시간대를 제어하는 파일이 있습니다. 방금 같은 문제가 있습니다. 해결책은 다음과 같습니다.
시간대를 수동으로 구성하지 않은 경우 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 변수 설정은 임시 해결책이며 때때로 "마스크"역할을 할 수도 있습니다.
date
재부팅하지 않고 작동했으며 OS를 다시 시작하면 sudo service crond restart
cron 작업 시간을 수정하기에 충분했습니다.
2017 년 3 월 현재, crond가 각 crontab에서 CRON_TZ 변수를 지원한다는 것을 발견했습니다.
CRON_TZ 변수는 cron 테이블에 특정한 시간대를 지정합니다. 사용자는 지정된 시간대에 따라 시간을 표에 입력해야합니다. 로그 파일에 쓰는 데 사용 된 시간은 데몬이 실행중인 로컬 시간대에서 가져옵니다.
— crontab (5) 매뉴얼 페이지에서 인용
이를 통해 서버가 UTC로 유지되는 동안 자동으로 DST를 설명하는 현지 시간으로 각 cronjob을 실행할 시간을 지정할 수있었습니다.
ls /usr/share/zoneinfo/America
을보기 위해 입력 했습니다.
좋아, 시간이 좀 걸렸고 우분투 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
참조하십시오 /etc/default/cron
. TZ
-all- crontab에 대해 여기서 설정할 수 있으며 TZ=UTC
iirc 여야합니다 . 그래서 당신의 방법은 효과가 있었을 것입니다.
fcron 을 보십시오 . 다른 시간대에서 개별 crontab을 설정할 수 있습니다.
timezone-name 'time zone of the system'
주어진 시간대에서 작업을 실행하십시오. timezone-name은 환경 변수 TZ에 유효한 문자열입니다. 자세한 내용은 시스템 설명서를 참조하십시오. 예를 들어, "유럽 / 파리"는 Linux 시스템에서 유효합니다. 이 옵션은 일광 절약 시간제 변경을 올바르게 처리합니다. 이 옵션을 정의하는 작업이 실행될 때 TZ 환경 변수는 시간대 값으로 설정됩니다.
잘못된 시간대 이름 인수를 제공하면 자동으로 무시되며 작업은 시스템의 시간대에서 실행됩니다.
우분투 전용 솔루션에 대한 다음 게시물 을 참조하십시오
나는 이것이 우분투 포럼이라는 것을 알고 있지만, 답변은 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 $?
쉘 스크립트에서 utc 시간을 평가하는 것은 어떻습니까? 쉘 스크립트가 매시간 실행되도록 스케줄하십시오. 스크립트 맨 위에서 date 명령에서 UTC 시간을 가져옵니다. 원하는 UTC 시간이 아니면 종료하십시오.
이 스크립트는 1am utc가 아닌 경우 종료됩니다.
#!/bin/bash
if [ $(date -u +"%H") != "01" ]; then
exit 0
fi
sudo service cron restart
편집 후 했어요 ?