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


63

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

Как ты делаешь это?

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

TZ="UTC"

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

Есть идеи?


1
ты сделал sudo service cron restartпосле редактирования?
Rinzwind

1
Нет ... но я попробовал это, и это не имело никакого значения.
Alj


Ответы:


45

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

  1. sudo dpkg-reconfigure tzdata - следуйте инструкциям, чтобы выбрать регион / страну
  2. sudo service cron restart
  3. timedatectl - Проверьте настройки даты

1
После установки часового пояса вы можете ввести dateв командной строке, чтобы подтвердить, что дата является правильной в соответствии с вашими ожиданиями.
mydoghasworms

Я перезапустил cron, но он все еще использует старый часовой пояс (UTC)?
Люк Фиск-Леннон

Это сработало без проблем для меня 18.10. ~ $ date возвращает правильное время. Люблю эти яркие цветные интерфейсы в стиле DOS! Благодарю.
Ириски

18

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

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

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

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


14

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

Если вы не настроили часовой пояс вручную, во время работы 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
+1 за решение, совместимое с CentOS (и EC2 Amazon Linux). Полный перезапуск может быть хорошей идеей, но для меня dateработало без перезагрузки, и перезапуска ОС sudo service crond restartбыло достаточно, чтобы исправить время работы cron.
Давур

+1 Спасибо, это работает.
Джим

13

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

Переменная CRON_TZ указывает часовой пояс, определенный для таблицы cron. Пользователь должен ввести время в соответствии с указанным часовым поясом в таблицу. Время, используемое для записи в файл журнала, берется из местного часового пояса, где работает демон.

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

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


Я также нашел эту ссылку полезной: serverfault.com/questions/848829/… . Чтобы найти нужный мне часовой пояс, я вошел, ls /usr/share/zoneinfo/Americaчтобы увидеть варианты.
cheevahagadog

7

Хорошо, я потратил некоторое время и выяснил, как это сделать на 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

1
Какой смысл устанавливать TZ = UTC в двух местах? Разве вы не можете просто положить его в файл crontab?
Phương Nguyễn

Нет. Помещение TZ = UTC в файл crontab устанавливает только для заданий cron, а не для самого cron. Это не влияет на сроки выполнения задания.
Марк Рид

5
  1. См /etc/default/cron. Вы можете установить TZздесь -all- crontabs, и это должен быть TZ=UTCiirc. Так что твой метод должен был сработать.

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

    timezone-name 'time zone of the system'

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

    Обратите внимание, что если вы укажете ошибочный аргумент timezone-name, он будет молча проигнорирован, и задание будет выполнено в часовом поясе системы.


Ну, я проверил это, и crontab работает, только когда я устанавливаю время запуска как местное время. Установка времени в UTC просто не работает.
al

спустя 4 года я посмотрел на файл в / etc / default / cron, и это официально устарело
theOther

Падение после 4 лет? Да, это недействительно сейчас, но это не было в тот же день. Тогда опять никто не пользователь 11.04 больше, я надеюсь.
Rinzwind

3
Если этот ответ неверен, вы, вероятно, должны удалить его; нет смысла сознательно хранить дезинформацию в StackExchange. Что используется , чтобы быть на тему и / или исправить это в значительной степени не имеет отношения к любому посещающему этой странице в поисках правильной информации.
Quuxplusone

4

Пожалуйста, смотрите мой следующий пост для решения для Ubuntu

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

Все, что вам нужно сделать, это добавить строку в скрипт инициализации демона cron. Установите и экспортируйте переменную окружения 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 $?

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

0

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

Этот скрипт завершится, если это не 1 час ночи.

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

0

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.