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

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

Как дела это?

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

TZ="UTC"

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

Какие-либо идеи?

64
задан 1 January 2016 в 04:58

12 ответов

  1. Посмотрите /etc/default/cron. Можно установить TZ здесь для - все-crontabs и это должны быть TZ=UTC iirc. Таким образом, Ваш метод должен был работать.

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

    timezone-name 'time zone of the system'

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

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

5
ответ дан 22 November 2019 в 23:34

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

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

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

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

19
ответ дан 22 November 2019 в 23:34

Хорошо, я не торопился и выяснил, как сделать это на Аккуратной Ubuntu, и здесь - как я заставил ее работать. Может быть более изящный путь, но этот путь работы.

Во-первых, мы должны перенести исполняемый файл крона в оболочку, которая устанавливает переменную TZ. Вот то, как:

cd /usr/sbin
mv cron cron.real

Затем создайте новый/usr/sbin/cron файл. Я использовал энергию, но можно использовать любого редактора, Вы хотите, просто заставляете файл быть похожим на это:

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

Сделайте новый исполняемый файл файла крона:

chmod ugo+rx cron

Теперь, перезапустите демона крона:

service cron restart

Ваши задания крона будут теперь работать на основанном на 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
7
ответ дан 22 November 2019 в 23:34

См. мое следующее сообщение для определенного для Ubuntu решения

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

Все, что необходимо сделать, добавляет строка к демону крона init сценарий. Набор и экспорт переменная среды TZ, как это:

export TZ=UTC

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

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

Вы, вероятно, не можете скопировать этот verbatim и иметь его работа над полем Ubuntu, но вот init сценарий, я раньше тестировал это на 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 $?
4
ответ дан 22 November 2019 в 23:34

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

  1. sudo dpkg-reconfigure tzdata - следуйте инструкциям для выбора региона/Страны
  2. sudo service cron restart
  3. timedatectl - Проверьте свои настройки даты
46
ответ дан 22 November 2019 в 23:34

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

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

  • создайте резервное копирование

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

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

    sudo ln -s /usr/share/zoneinfo/America/Chicago /etc/localtime
    
  • Затем перезагрузка. Когда Ваш системный запуск работает: дата

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

К вашему сведению: установка переменной TZ является временным решением и могла бы иногда действовать как "маска".

14
ответ дан 22 November 2019 в 23:34

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

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

— кавычка от crontab (5) страница руководства

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

13
ответ дан 22 November 2019 в 23:34

Просто понятый это на 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
ответ дан 22 November 2019 в 23:34

Что относительно того, чтобы оценить время UTC в сценарии оболочки? Запланируйте сценарий оболочки для выполнения каждый час. Наверху сценария получают час UTC до команды даты. Если это не час UTC, Вы хотите, выход.

Этот сценарий выйдет, если это не будет 1:00 UTC.

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

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

0
ответ дан 22 November 2019 в 23:34

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

timedatectl list-timezones
timedatectl set-timezone America/Los_Angeles
service cron restart
1
ответ дан 7 January 2020 в 16:34

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

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

.
0
ответ дан 1 March 2020 в 18:37

Другие вопросы по тегам:

Похожие вопросы: