Jak ustawić strefę czasową dla crontab?

63

Ustawiłem budzenie ACPI, aby mój laptop budził się o określonej godzinie każdego ranka. Strefa czasowa tego czasu to UTC. Chcę skonfigurować crontabs również za pomocą UTC, aby pasowały do ​​alarmu budzenia.

Jak ty to robisz?

Próbowałem edytować, /etc/default/cronaby uwzględnić:

TZ="UTC"

ale to nie działa. (Też próbowałem TZ=UTCi TZ="UTC/GMT")

Jakieś pomysły?

alj
źródło
1
zrobiłeś sudo service cron restartpo edycji?
Rinzwind
1
Nie ... ale spróbowałem i to nie miało znaczenia.
alj
1
możliwy duplikat ustawienia strefy czasowej z terminala
Izaak Betesh
superuser.com/questions/248841/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Odpowiedzi:

44

Miałem podobny problem na Trusty (14.04). Rozwiązano go, ustawiając strefę czasową maszyny, a następnie ponownie uruchamiając cronusługę

  1. sudo dpkg-reconfigure tzdata - postępuj zgodnie z instrukcjami, aby wybrać region / kraj
  2. sudo service cron restart
onlyjsmith
źródło
1
Po ustawieniu strefy czasowej możesz wpisać datew wierszu polecenia, aby potwierdzić poprawność daty zgodnie z oczekiwaniami.
mydoghasworms
Zrestartowałem crona, ale nadal używa starej strefy czasowej (UTC)?
Luke Fisk-Lennon
To zadziałało dla mnie bezproblemowo 18.10. ~ $ date zwraca poprawną godzinę. Uwielbiam te kolorowe interfejsy GUI w stylu DOS! Dzięki.
itsricky
18

Nie ma łatwego sposobu na osiągnięcie tego. cron używa czasu lokalnego. /etc/default/crona inne TZspecyfikacje w crontab określają tylko, jakie TZpowinny być użyte w procesach uruchamianych przez cron, nie ma to wpływu na czas rozpoczęcia.

Większość rozwiązań, które widziałem, zawiera narzędzie w środku, więc cron zainicjuje coś, co następnie określi, kiedy należy uruchomić UTC (np. Jeśli wiesz, że martwisz się tylko zmianami DST, uruchom go 2 godziny wcześniej, oblicz różnica czasu, a następnie kopać go. Zapraszamy do obejrzenia at. Aby to zrobić, ludzie często używają perllub pythonlub podobnych języków skryptowych).

Istnieje nieprzyjemny sposób na zhakowanie go, jeśli chcesz. cron odczytuje informacje TZ z systemu tylko podczas uruchamiania. Więc jeśli jest to zawsze uruchomiony serwer, możesz po prostu ustawić TZ na UTC, zrestartować, a po uruchomieniu ustawić na lokalną strefę czasową. Możesz to również napisać.

Jako alternatywne podejście, spójrz także na @rebootskładnię crona, który powinien uruchamiać skrypty po uruchomieniu, co brzmi jak możesz.

Ciastko
źródło
14

Jest plik, który kontroluje strefę czasową systemu. Właśnie dostałem ten sam problem, oto rozwiązanie:

Jeśli nie skonfigurujesz ręcznie żadnej strefy czasowej, podczas działania datepowinna być wyświetlana godzina UTC.

  • utwórz kopię zapasową

    sudo cp /etc/localtime /etc/localtime.bkp
    
  • usuń plik:

    sudo rm /etc/localtime
    
  • Mieszkam w Chicago (możesz potrzebować zmienić ścieżkę, używając klawiszy tabulacji pomaga), więc:

    sudo ln -s /usr/share/zoneinfo/America/Chicago /etc/localtime
    
  • Następnie uruchom ponownie. Podczas uruchamiania systemu: data

  • teraz twoja strefa czasowa powinna już tam być, a cron na to spojrzy.

FYI: ustawienie zmiennej TZ jest rozwiązaniem tymczasowym i może czasami działać jak „maska”.

Vinicius Egerland
źródło
1
+1 za rozwiązanie kompatybilne z CentOS (i EC2 Amazon Linux). Pełny restart może być dobrym pomysłem, ale dla mnie datedziałał bez restartu, a ponowne uruchomienie baru systemu operacyjnego sudo service crond restartwystarczyło, aby naprawić czasy zadań crona.
davur
+1 Dzięki, działa.
Jim
13

W marcu 2017 roku odkryłem, że crond obsługuje zmienną CRON_TZ w każdym crontabie.

Zmienna CRON_TZ określa strefę czasową specyficzną dla tabeli cron. Użytkownik powinien wprowadzić do tabeli czas zgodnie z określoną strefą czasową. Czas używany do zapisania w pliku dziennika jest pobierany z lokalnej strefy czasowej, w której działa demon.

- cytat ze strony podręcznika crontab (5)

Pozwoliło mi to określić czas wykonania każdego zadania cronjob w czasie lokalnym, który automatycznie uwzględniał czas letni, podczas gdy serwer pozostawał w UTC.

Keith Shaw
źródło
Ja również znaleźć ten link jako: serverfault.com/questions/848829/... . Aby znaleźć opcję strefy czasowej, której potrzebowałem, wszedłem, ls /usr/share/zoneinfo/Americaaby zobaczyć opcje.
cheevahagadog
7

OK, poświęciłem trochę czasu i wymyśliłem, jak to zrobić na Ubuntu Natty, i oto, jak to zrobiłem. Może być bardziej elegancki sposób, ale ten sposób działa.

Po pierwsze, musimy owinąć plik wykonywalny crona powłoką, która ustawia zmienną TZ. Oto jak:

cd /usr/sbin
mv cron cron.real

Następnie utwórz nowy plik / usr / sbin / cron. Użyłem vima, ale możesz użyć dowolnego edytora, po prostu spraw, aby plik wyglądał tak:

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

Ustaw nowy plik cron jako wykonywalny:

chmod ugo+rx cron

Teraz zrestartuj demona cron:

service cron restart

Twoje zadania cron będą teraz działać zgodnie z harmonogramem opartym na UTC - JEDNAK, mimo że czas ich wykonania będzie ustawiony na UTC, to po ich uruchomieniu strefa czasowa zostanie ustawiona na wartość zdefiniowaną dla systemu. Aby to zmienić, umieść to w swoim crontabie przed wszelkimi poleceniami:

TZ=UTC

Twój crontab będzie wyglądał mniej więcej tak:

# 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
źródło
1
Po co ustawiać TZ = UTC w dwóch miejscach? Nie możesz po prostu umieścić go w pliku crontab?
Phương Nguyễn
Nie. Umieszczenie TZ = UTC w pliku crontab ustawia go tylko dla zadań cron, a nie dla samego crona. Nie wpływa to na czas wykonywania zadania.
Mark Reed,
5
  1. Zobaczyć /etc/default/cron. Możesz ustawić TZtutaj dla -all- crontabs i powinno to być TZ=UTCiirc. Więc twoja metoda powinna była zadziałać.

  2. Spójrz na fcron . Możesz ustawić poszczególne tabele crontab w różnych strefach czasowych:

    timezone-name 'time zone of the system'

    Uruchom zadanie w danej strefie czasowej. timezone-name to ciąg znaków, który jest ważny dla zmiennej środowiskowej TZ: więcej informacji można znaleźć w dokumentacji systemu. Na przykład „Europa / Paryż” jest ważny w systemie Linux. Ta opcja poprawnie obsługuje zmiany czasu letniego. Zmienna środowiskowa TZ jest ustawiona na wartość strefy czasowej, gdy uruchamiane jest zadanie definiujące tę opcję.

    Pamiętaj, że jeśli podasz błędny argument nazwa-strefy czasowej, zostanie on CICHO zignorowany, a zadanie będzie działać w strefie czasowej systemu.

Rinzwind
źródło
Sprawdziłem to, a crontab działa tylko wtedy, gdy ustawiłem czas wyzwalania jako czas lokalny. Ustawienie czasu na UTC po prostu nie działa.
alj
4 lata później i
rzuciłem
Opinia negatywna po 4 latach? Tak, to jest teraz nieważne, ale nie było tego dnia. Mam nadzieję, że nikt już nie jest użytkownikiem 11.04.
Rinzwind
3
Jeśli ta odpowiedź jest nieprawidłowa, prawdopodobnie powinieneś ją usunąć; nie ma sensu świadomie utrzymywać dezinformację na StackExchange. To, że kiedyś było na temat i / lub poprawne, jest praktycznie nieistotne dla każdego, kto odwiedza tę stronę w poszukiwaniu poprawnych informacji.
Quuxplusone
4

Proszę zobaczyć mój następny post dla rozwiązania specyficznego dla Ubuntu

Wiem, że to forum Ubuntu, ale wierzę, że odpowiedź będzie bardzo podobna do tego, jak zrobiłbyś to w systemie Red Hat. Nie mam pod ręką systemu Ubuntu do testowania tego, ale przetestowałem go na Red Hat.

Wszystko, co musisz zrobić, to dodać wiersz do skryptu inicjującego demona cron. Ustaw i wyeksportuj zmienną środowiskową TZ, w następujący sposób:

export TZ=UTC

Następnie uruchom ponownie demona cron. Upewnij się, że umieściłeś ten eksport w skrypcie startowym demona cron PO jakichkolwiek innych ustawieniach zmiennych i źródłach - myślę, że to może być przyczyną, dla której edytowanie /etc/default/cronskryptu przez pierwotnego plakatu nie zadziałało. Może to ustawił, ale potem został zresetowany przez coś jeszcze w dalszej części skryptu.

Zauważ, że wpłynie to tylko na samego demona cron, a nie na zadania uruchamiane przez cron, więc jeśli chcesz, aby zadanie cron używało UTC jako swojej strefy czasowej, musisz również ustawić je w samym zadaniu.

Prawdopodobnie nie możesz skopiować tego dosłownie i sprawić, by działało na polu Ubuntu, ale oto skrypt inicjujący, którego użyłem do przetestowania tego na Red Hat. Eksport znajdziesz tuż przed start()funkcją:

#!/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
źródło
0

Właśnie to odkryłem na Ubuntu 14/16. Działa idealnie dla mnie.

Kroki (implikowane 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
Varun Chandak
źródło
0

A co z oceną czasu utc w skrypcie powłoki? Zaplanuj uruchamianie skryptu powłoki co godzinę. Na górze skryptu pobierz godzinę UTC z polecenia date. Jeśli nie jest to godzina UTC, wyjdź.

Ten skrypt zakończy działanie, jeśli nie jest to 1 rano utc.

#!/bin/bash
if [ $(date -u +"%H") != "01" ]; then
 exit 0
fi
użytkownik754068
źródło
0

Możesz ustawić zmienną środowiskową CRON_TZ Jeśli zadanie cron jest uruchamiane na zdalnym serwerze, prawdopodobnie powinieneś zauważyć, że powłoką używaną przez crontab jest sh . Możesz dwukrotnie sprawdzić / etc / crontab .

PT Huynh
źródło