Как установить часовой пояс для crontab?

52

Я настроил пробуждение ACPI, поэтому мой ноутбук просыпается в определенное время каждое утро. Часовой пояс для этого - UTC. Я хочу настроить свои crontabs также с помощью UTC, чтобы они соответствовали тревоге пробуждения.

Как вы это делаете?

Я пробовал редактировать /etc/default/cron , чтобы включить:

TZ="UTC"

, но это не сработает. (Я также пробовал TZ=UTC и TZ="UTC/GMT" )

Любые идеи?

    
задан alj 24.07.2011 в 19:40
источник

10 ответов

32

У меня была аналогичная проблема с Trusty (14.04). Решив его, установив часовой пояс машины, перезагрузите cron service

  1. sudo dpkg-reconfigure tzdata - следуйте инструкциям, чтобы выбрать Регион / Страна
  2. sudo service cron restart
ответ дан onlyjsmith 13.10.2014 в 12:51
14

Нет простого способа добиться этого. cron использует локальное время. /etc/default/cron и другие TZ спецификации в crontab просто указывают, какой TZ следует использовать для процессов, запущенных cron, это не влияет на время начала.

Большинство решений, которые я видел, включают в себя полезность в середине, поэтому cron начнет что-то, что затем определит, когда нужно ударить в UTC (например, если вы знаете, что вас беспокоят только изменения DST, отпустите его за 2 часа до , вычислите разницу во времени и отпустите его тогда. Посмотрите на at . Для этого люди часто используют perl или python или аналогичные языки сценариев).

Существует неприятный способ взломать его, если хотите. cron только считывает информацию TZ с системы при запуске. Поэтому, если это постоянно работающий сервер, вы можете просто установить TZ в UTC, перезагрузиться и после загрузки установите его в свой часовой пояс. Вы также можете написать это.

В качестве альтернативного подхода также рассмотрим синтаксис @reboot cron, который должен выполнять скрипты после загрузки, что похоже на то, что вы можете захотеть.

    
ответ дан Cookie 11.07.2012 в 19:26
8

Существует файл, который управляет системным часовым поясом .. Я просто получил ту же проблему, вот решение:

Если вы не настроили вручную какой-либо часовой пояс, запуск date должен отображать время UTC.

  • создать резервную копию

    sudo cp /etc/localtime /etc/localtime.bkp
    
  • удалите файл:

    sudo rm /etc/localtime
    
  • Я живу в Чикаго (вам может понадобиться изменить путь, используя вкладку), так:

    sudo ln -s /usr/share/zoneinfo/America/Chicago /etc/localtime
    
  • Затем перезагрузитесь. При запуске системы выполните следующие действия: дата

  • теперь ваш часовой пояс должен быть там сейчас, и cron будет смотреть на это.

FYI: установка переменной TZ является временным решением и иногда может выступать как «маска».

    
ответ дан Vinicius Egerland 08.02.2015 в 00:44
7

По состоянию на март 2017 года я обнаружил, что crond поддерживает переменную CRON_TZ в каждом crontab.

The CRON_TZ variable specifies the time zone specific for the cron table. The user should enter a time according to the specified time zone into the table. The time used for writing into a log file is taken from the local time zone, where the daemon is running.

- цитата из справочной страницы crontab (5)

Это позволило мне указать время выполнения каждого cronjob в локальное время, которое автоматически учитывало DST, а сервер оставался в UTC.

    
ответ дан Keith Shaw 30.03.2017 в 21:12
6

Хорошо, я потратил некоторое время и понял, как это сделать на Ubuntu Natty, и вот как я сделал это. Может быть более элегантный способ, но этот способ работает.

Во-первых, нам нужно обернуть исполняемый файл cron в оболочке, которая устанавливает переменную 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
    
ответ дан James Parks 10.03.2013 в 20:08
5
  1. См. /etc/default/cron . Вы можете установить TZ здесь для -all-crontabs, и это должно быть TZ=UTC iirc. Поэтому ваш метод должен был работать.

  2. Посмотрите fcron . Вы можете установить отдельные кронтабы в разных часовых поясах:

    timezone-name 'time zone of the system'

    Запустите задание в данном часовом поясе. timezone-name - это строка, действительная для переменной окружения TZ: более подробную информацию см. в документации вашей системы. Например, «Европа / Париж» действует в системе Linux. Эта опция обрабатывает переход на летнее время. При задании задания, заданном этой опцией, переменная окружения TZ устанавливается в значение часового пояса.

    Обратите внимание, что если вы дадите ошибочный аргумент имени часового пояса, он будет проигнорирован SILENTLY, и задание будет выполняться в часовом поясе системы.

ответ дан Rinzwind 24.07.2011 в 19:48
4

Обратитесь к моему следующему сообщению для решения, специфичного для Ubuntu.

Я знаю, что это форум Ubuntu, но я считаю, что ответ будет очень похож на то, как вы это сделаете в системе Red Hat. У меня нет системы Ubuntu, чтобы проверить это, но я проверил ее на Red Hat.

Все, что вам нужно сделать, это добавить строку к скрипту инициализации cron daemon. Установите и экспортируйте переменную окружения TZ, например:

export TZ=UTC

Затем перезапустите демона cron. Удостоверьтесь, что вы поместили этот экспорт в скрипт запуска демона cron ПОСЛЕ любых других настроек переменных и источников - я думаю, это может быть причиной того, что редактирование оригинального плаката скрипта /etc/default/cron не сработало для него. Возможно, он установил его, но затем он был сброшен с помощью чего-то еще в скрипте.

Обратите внимание, что это повлияет только на самого демона cron, а не на задания, выполняемые через cron, поэтому, если вы хотите, чтобы задание cron использовало UTC в качестве своего часового пояса, вам также нужно будет установить его в самой задаче .

Вероятно, вы не можете скопировать этот дословный текст и работать в окне Ubuntu, но вот сценарий инициализации, который я использовал для проверки этого в Red Hat. Вы увидите экспорт прямо перед функцией 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 $?
    
ответ дан James Parks 10.03.2013 в 16:08
0

Просто понял это на Ubuntu 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
    
ответ дан kintuparantu 14.02.2017 в 07:29
0

Как оценивать время utc в сценарии оболочки? Расписание сценария оболочки запускается каждый час. В верхней части скрипта вы получите часовой пояс UTC с помощью команды date. Если вам не нужен часовой пояс UTC, выйдите.

Этот скрипт выйдет, если он не является 1am utc.

#!/bin/bash
if [ $(date -u +"%H") != "01" ]; then
 exit 0
fi
    
ответ дан user754068 31.10.2017 в 01:02
0

Вы можете установить переменную окружения CRON_TZ Если задание cron запущено на удаленном сервере, вы, вероятно, должны заметить, что оболочка, используемая crontab, sh . Вы можете дважды проверить / etc / crontab .

    
ответ дан PT Huynh 21.06.2018 в 02:51