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


63

Я встановив режим пробудження ACPI, тому мій ноутбук прокидається в певний час щоранку. Часовий пояс для цього - UTC. Я хочу налаштувати мої хронометри також за допомогою UTC, щоб вони відповідали сигналу будильника.

Як ви це робите?

Я спробував редагувати, /etc/default/cronщоб включити:

TZ="UTC"

але це не працює. (Я також пробував TZ=UTCі TZ="UTC/GMT")

Будь-які ідеї?


1
ви зробили sudo service cron restartпісля редагування?
Rinzwind

1
Ні ... але я спробував це, і це не мало значення.
alj


Відповіді:


44

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

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

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

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

Це працювало для мене безперечно 18.10. ~ $ date повертає правильний час. Мені подобаються ці яскраві кольорові інтерфейси інтерфейсу GUI у стилі 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 буде дивитись на це.

FYI: встановлення змінної TZ є тимчасовим рішенням, і іноді може діяти як "маска".


1
+1 за рішення, сумісне з CentOS (та EC2 Amazon Linux). Повний перезапуск може бути хорошою ідеєю, але для мене dateпрацював без перезавантаження, і смуги перезавантаження ОС sudo service crond restartбуло достатньо, щоб виправити час моєї роботи з крон.
давр

+1 Спасибі, що працює.
Джим

13

Станом на березень 2017 року я виявив, що crond підтримує змінну CRON_TZ у кожному кронтабі.

Змінна CRON_TZ визначає конкретний часовий пояс для таблиці кронів. Користувач повинен ввести в таблицю часовий пояс за вказаним часовим поясом. Час, який використовується для запису у файл журналу, приймається з локального часового поясу, де працює демон.

- цитата зі сторінки керівництва crontab (5)

Це дозволило мені вказати час виконання кожної задачі за місцевим часом, що автоматично припадало на DST, а сервер залишався в UTC.


Я також вважаю це посилання корисним: serverfault.com/questions/848829/… . Щоб знайти потрібний варіант часового поясу, я ввійшов, ls /usr/share/zoneinfo/Americaщоб переглянути варіанти.
chevahagadog

7

Гаразд, я зайняв деякий час і придумав, як це зробити на Ubuntu Natty, і ось, як я змусив це працювати. Може бути і більш елегантний спосіб, але такий спосіб працює.

По-перше, нам потрібно загорнути виконуваний файл крона в оболонку, яка встановлює змінну 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

Ваші завдання в системі тепер будуть виконуватись за графіком, заснованим на 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 . Ви можете встановити окремі кронти в різних часових поясах:

    timezone-name 'time zone of the system'

    Виконайте завдання у заданому часовому поясі. timezone-name - це рядок, який дійсний для змінної середовища TZ: детальніше див. документацію вашої системи. Наприклад, "Європа / Париж" діє в системі Linux. Ця опція правильно обробляє зміну літнього часу. Змінна середовища TZ оточення встановлюється на значення часового поясу, коли виконується завдання, що визначає цю опцію.

    Зауважте, що якщо ви введете помилковий аргумент назви часового поясу, він буде ВІДМОВАНО ігноруватися, а завдання буде виконуватися у часовому поясі системи.


Добре я перевірив, і crontab працює лише тоді, коли я встановив час спрацьовування як місцевий час. Встановити час на UTC просто не працює.
alj

добре через 4 роки, і я зазирнув до файлу в / etc / default / cron, і зараз це офіційно застаріло
the0ther

Зниження через 4 роки? Так, це зараз недійсно, але його не було назад. Потім знову ніхто не користувач 11.04, сподіваюся.
Rinzwind

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

4

Перегляньте мою наступну публікацію щодо конкретного рішення для Ubuntu

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

Все, що вам потрібно зробити - це додати рядок до сценарію cem daemon init. Встановіть та експортуйте змінну середовища TZ, наприклад:

export TZ=UTC

Потім перезапустіть свій крон-демон. Переконайтеся, що ви поставили цей експорт у сценарій запуску демона Cron ПІСЛЯ будь-яких інших параметрів змінної та пошуку - я думаю, що це може бути причиною того, що оригінальна редакція /etc/default/cronсценарію сценарію не працювала для нього. Можливо, він його встановив, але потім він скинувся на щось інше далі в сценарії.

Зауважте, що це вплине лише на саму демон крона, а не на завдання, які ви виконуєте через cron, тож якщо ви хочете, щоб робота cron використовувала UTC як свій часовий пояс, вам доведеться встановити його і в самій роботі.

Ви, ймовірно, не можете скопіювати цей дослівний текст і змусити його працювати на коробці 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 $?

0

Щойно зрозумів це на Ubuntu 14/16. Для мене прекрасно працювали.

Кроки (судо маються на увазі):

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:00 utc.

#!/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.