Wie stellen Sie die Zeitzone für crontab ein?

63

Ich habe ACPI Wakeup eingerichtet, damit mein Laptop jeden Morgen zu einer bestimmten Zeit aufwacht. Die Zeitzone hierfür ist UTC. Ich möchte meine Crontabs auch mit UTC einrichten, damit sie zum Weckalarm passen.

Wie machst du das?

Ich habe versucht, folgende Elemente /etc/default/cronzu bearbeiten :

TZ="UTC"

aber es geht nicht. (Ich habe es auch versucht TZ=UTCund TZ="UTC/GMT")

Irgendwelche Ideen?

alj
quelle
1
hast du eine sudo service cron restartnachbearbeitung gemacht?
Rinzwind
1
Nein ... aber ich habe es versucht und es machte keinen Unterschied.
Alj
1
Möglicherweise doppelte Einstellung der Zeitzone vom Terminal
Isaac Betesh

Antworten:

44

Ich hatte ein ähnliches Problem bei Trusty (14.04). Das Problem wurde behoben, indem die Zeitzone des Computers festgelegt und der cronDienst neu gestartet wurde

  1. sudo dpkg-reconfigure tzdata - Befolgen Sie die Anweisungen zur Auswahl von Region / Land
  2. sudo service cron restart
nurschmied
quelle
1
Nachdem Sie die Zeitzone eingestellt haben, können Sie datein die Befehlszeile eingeben, um zu bestätigen, dass das Datum Ihren Erwartungen entspricht.
Mydoghasworms
Ich habe cron neu gestartet, aber es wird immer noch die alte Zeitzone (UTC) verwendet.
Luke Fisk-Lennon
Bei mir hat das am 18.10. Nahtlos geklappt. ~ $ date gibt die korrekte Zeit zurück. Ich muss diese farbenfrohen Benutzeroberflächen im DOS-Stil lieben! Vielen Dank.
Es ist der
18

Es gibt keinen einfachen Weg, dies zu erreichen. cron verwendet die Ortszeit. /etc/default/cronund andere TZspezifikationen in der crontab geben nur an, was TZfür die von cron gestarteten prozesse verwendet werden soll, dies hat keinen einfluss auf die startzeit.

Die meisten Lösungen, die ich gesehen habe, beinhalten ein Dienstprogramm in der Mitte, so dass cron etwas auslöst, das dann bestimmt, wann es in UTC losgeht (z. B. wenn Sie wissen, dass Sie nur über DST-Änderungen besorgt sind, starten Sie es 2 Stunden vorher, berechnen Sie die Zeitdifferenz, und es beginnt dann. auf einen Blick hat at. Um das zu tun, verwenden die Menschen oft perloder pythonoder ähnliche Skriptsprachen).

Es gibt einen fiesen Weg, es zu hacken, wenn Sie wollten. cron liest die TZ-Informationen nur beim Systemstart aus. Wenn dies also ein ständig laufender Server ist, können Sie TZ einfach auf UTC einstellen, neu starten und nach dem Start auf Ihre lokale Zeitzone einstellen. Sie könnten dies auch skripten.

Schauen Sie sich alternativ auch die @rebootSyntax von cron an, die nach dem Booten Skripte ausführen sollte, was sich nach Ihren Wünschen anhört.

Plätzchen
quelle
14

Es gibt eine Datei, die die Zeitzone des Systems steuert. Ich habe gerade das gleiche Problem, hier ist die Lösung:

Wenn Sie keine Zeitzone manuell konfiguriert haben, datesollte beim Ausführen die UTC-Zeit angezeigt werden.

  • Erstellen Sie ein Backup

    sudo cp /etc/localtime /etc/localtime.bkp
    
  • entferne die Datei:

    sudo rm /etc/localtime
    
  • Ich wohne in Chicago (möglicherweise müssen Sie den Pfad mithilfe der Tabulatortaste ändern), um Folgendes zu tun:

    sudo ln -s /usr/share/zoneinfo/America/Chicago /etc/localtime
    
  • Starten Sie dann neu. Wenn Ihr Systemstart durchgeführt wird: Datum

  • Jetzt sollte deine Zeitzone da sein und cron wird sich das ansehen.

Zu Ihrer Information: Das Festlegen der TZ-Variablen ist eine vorübergehende Lösung und kann manchmal als "Maske" fungieren.

Vinicius Egerland
quelle
1
+1 für eine CentOS-kompatible Lösung (und EC2 Amazon Linux). Ein vollständiger Neustart mag eine gute Idee sein, aber ich habe dateohne Neustart gearbeitet, und ein Neustart des Betriebssystems sudo service crond restartwar genug, um meine Cron-Job-Zeiten zu korrigieren.
Davur
+1 Danke, es funktioniert.
Jim
13

Ab März 2017 habe ich festgestellt, dass crond die Variable CRON_TZ in jeder Crontab unterstützt.

Die Variable CRON_TZ gibt die für die Cron-Tabelle spezifische Zeitzone an. Der Benutzer sollte eine Zeit gemäß der angegebenen Zeitzone in die Tabelle eingeben. Die zum Schreiben in eine Protokolldatei verwendete Zeit wird aus der lokalen Zeitzone abgerufen, in der der Dämon ausgeführt wird.

- Zitat aus der Manpage von crontab (5)

Auf diese Weise konnte ich die Zeit für die Ausführung jedes Cronjobs in lokaler Zeit angeben, die automatisch die Sommerzeit abrechnete, während der Server in UTC blieb.

Keith Shaw
quelle
Ich fand diesen Link auch hilfreich: serverfault.com/questions/848829/… . Um die von mir benötigte Zeitzonenoption zu finden, habe ich eingegeben ls /usr/share/zoneinfo/America, um die Optionen anzuzeigen.
Cheevahagadog
7

OK, ich habe mir etwas Zeit genommen und herausgefunden, wie das mit Ubuntu Natty geht. Und so habe ich es gemacht. Es mag einen eleganteren Weg geben, aber dieser Weg funktioniert.

Zuerst müssen wir die Cron-Programmdatei in eine Shell einbinden, die die TZ-Variable setzt. Hier ist wie:

cd /usr/sbin
mv cron cron.real

Erstellen Sie dann eine neue Datei / usr / sbin / cron. Ich habe vim verwendet, aber Sie können einen beliebigen Editor verwenden. Lassen Sie die Datei einfach so aussehen:

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

Machen Sie die neue Cron-Datei ausführbar:

chmod ugo+rx cron

Starten Sie nun den Cron-Daemon neu:

service cron restart

Ihre Cron-Jobs werden jetzt nach einem UTC-basierten Zeitplan ausgeführt. Die Zeitzone wird jedoch auf die für das System festgelegte Zeit eingestellt, auch wenn die Zeit, zu der sie ausgeführt werden, UTC ist. Um dies zu ändern, fügen Sie dies in Ihre crontab ein, bevor Sie Befehle eingeben:

TZ=UTC

So sieht Ihre Crontab etwa so aus:

# 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
quelle
1
Was bringt es, TZ = UTC an zwei Stellen einzustellen? Kannst du es nicht einfach in die Crontab-Datei schreiben?
Phương Nguyễn
Wenn Sie TZ = UTC in die crontab-Datei einfügen, wird dies nur für die Cron-Jobs festgelegt, nicht für Cron selbst. Das Timing der Jobausführung wird nicht beeinflusst.
Mark Reed
5
  1. Sehen /etc/default/cron. Sie können TZhier -all- crontabs einstellen und es sollte TZ=UTCiirc sein. Ihre Methode hätte also funktionieren sollen.

  2. Schauen Sie sich fcron an . Sie können einzelne Crontabs in verschiedenen Zeitzonen einstellen:

    timezone-name 'time zone of the system'

    Führen Sie den Job in der angegebenen Zeitzone aus. timezone-name ist eine Zeichenfolge, die für die Umgebungsvariable TZ gültig ist. Weitere Informationen finden Sie in der Dokumentation Ihres Systems. Beispielsweise ist "Europe / Paris" auf einem Linux-System gültig. Diese Option behandelt Änderungen der Sommerzeit korrekt. Die Umgebungsvariable TZ wird auf den Wert der Zeitzone gesetzt, wenn ein Job ausgeführt wird, der diese Option definiert.

    Beachten Sie, dass ein falsches Argument für den Zeitzonennamen STILLSCHWEIGEND ignoriert wird und der Job in der Zeitzone des Systems ausgeführt wird.

Rinzwind
quelle
Nun, ich habe es überprüft und die Crontab funktioniert nur, wenn ich die Triggerzeit als Ortszeit eingestellt habe. Das Einstellen der Zeit auf UTC funktioniert einfach nicht.
Alj
gut 4 Jahre später und ich hatte einen Blick auf die Datei in / etc / default / cron und dies ist jetzt offiziell veraltet
the0ther
Eine Ablehnung nach 4 Jahren? Ja, das ist jetzt ungültig, aber es war nicht früher. Dann ist wieder niemand mehr User 11.04, hoffe ich.
Rinzwind
3
Wenn diese Antwort ungültig ist, sollten Sie sie wahrscheinlich löschen. Es macht keinen Sinn, wissentlich Fehlinformationen in StackExchange aufzubewahren. Dass es früher themenbezogen und / oder korrekt war, ist für jeden, der diese Seite auf der Suche nach korrekten Informationen besucht, so gut wie irrelevant.
Quuxplusone
4

In meinem nächsten Beitrag finden Sie eine Ubuntu-spezifische Lösung

Ich weiß, dass dies ein Ubuntu-Forum ist, aber ich glaube, die Antwort wird sehr ähnlich sein, wie Sie dies auf einem Red Hat-System tun würden. Ich habe kein Ubuntu-System, um dies zu testen, aber ich habe es auf Red Hat getestet.

Alles, was Sie tun müssen, ist eine Zeile in Ihr Cron-Daemon-Init-Skript einzufügen. Setzen und exportieren Sie die Umgebungsvariable TZ wie folgt:

export TZ=UTC

Starten Sie dann Ihren Cron-Daemon neu. Stellen Sie sicher, dass Sie diesen Export in das Startskript des Cron-Daemons nach jeder anderen Variableneinstellung und Quellenangabe einfügen. Ich denke, dies könnte der Grund dafür sein, dass die Bearbeitung des /etc/default/cronSkripts durch den ursprünglichen Poster für ihn nicht funktioniert hat. Vielleicht hat er es eingestellt, aber es wurde dann von etwas anderem weiter unten im Skript zurückgesetzt.

Beachten Sie, dass dies nur den Cron-Daemon selbst betrifft und nicht die Jobs, die Sie über Cron ausführen. Wenn Sie also möchten, dass ein Cron-Job UTC als Zeitzone verwendet, müssen Sie ihn auch im Job selbst festlegen.

Sie können dieses Skript wahrscheinlich nicht wörtlich kopieren und auf einer Ubuntu-Box verwenden, aber hier ist das Init-Skript, mit dem ich es auf Red Hat getestet habe. Sie finden den Export direkt vor der start()Funktion:

#!/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
quelle
0

Habe das gerade auf Ubuntu 14/16 herausgefunden. Arbeitete perfekt für mich.

Schritte (sudo impliziert):

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
quelle
0

Was ist mit der Auswertung der UTC-Zeit in einem Shell-Skript? Planen Sie die stündliche Ausführung des Shell-Skripts. Holen Sie sich oben im Skript die UTC-Stunde aus dem Datumsbefehl. Wenn es nicht die UTC-Stunde ist, die Sie möchten, beenden Sie.

Dieses Skript wird beendet, wenn es nicht 1 Uhr UTC ist.

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

Sie können die Umgebungsvariable CRON_TZ festlegen. Wenn der Cron-Job auf einem Remote-Server ausgeführt wird, sollten Sie wahrscheinlich feststellen, dass die von crontab verwendete Shell sh ist . Sie können / etc / crontab noch einmal überprüfen .

PT Huynh
quelle