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

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

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

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

TZ="UTC"

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

Есть идеи?

13 ответов

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

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

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

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

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

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

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

Если вы не настроили вручную часовой пояс, запустите 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 является временным решением и может иногда выступать в роли "маски".

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

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

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

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

Хорошо, я потратил некоторое время и выяснил, как это сделать на 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. Увидеть /etc/default/cron, Вы можете установить TZ здесь для всех crontabs, и это должно быть TZ=UTC IIRC. Так что твой метод должен был сработать.

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

    timezone-name 'time zone of the system'

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

    Обратите внимание, что если вы укажете ошибочный аргумент time zone-name, он будет БЕСПЛАТНО проигнорирован, и задание будет выполнено в часовом поясе системы.

Пожалуйста, смотрите мой следующий пост для решения для 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 $?

Вы также можете использовать timedatectl для поиска и установки часового пояса. (Ubuntu 18)

timedatectl list-timezones
timedatectl set-timezone America/Los_Angeles
service cron restart

Добавлять

TZ="Европа/Варшава"

но не в etc!: Запустите редактор службы cron

      systemctl edit cron.service

а затем, после того, как вы добавите и сохраните, как указано выше, запустите

      service cron restart

Обновленный ответ для новых версий cron.

sudo systemctl edit cron.serviceЕсли этого файла не существует, он будет создан. Добавьте TZ=EST, TZ=UTC и т. Д.

Только что понял это на 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

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

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

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

#!/bin/bash
if [ $(date -u +"%H") != "01" ]; then
 exit 0
fi
Другие вопросы по тегам