Bagaimana Anda mengatur zona waktu untuk crontab?


63

Saya telah mengatur bangun ACPI sehingga laptop saya bangun pada waktu tertentu setiap pagi. Zona untuk ini adalah UTC. Saya ingin mengatur crontab saya juga menggunakan UTC sehingga cocok dengan alarm bangun.

Bagaimana Anda melakukannya?

Saya sudah mencoba mengedit /etc/default/cronuntuk memasukkan:

TZ="UTC"

tetapi tidak berhasil. (Saya juga sudah mencoba TZ=UTCdan TZ="UTC/GMT")

Ada ide?


1
apakah Anda melakukan sudo service cron restartsetelah mengedit?
Rinzwind

1
Tidak ... tapi saya mencobanya dan tidak ada bedanya.
alj


Jawaban:


45

Saya memiliki masalah serupa pada Trusty (14.04). Mengatasinya dengan mengatur zona waktu mesin kemudian memulai kembali cronlayanan

  1. sudo dpkg-reconfigure tzdata - ikuti instruksi untuk memilih Wilayah / Negara
  2. sudo service cron restart
  3. timedatectl - Verifikasi pengaturan tanggal Anda

1
Setelah mengatur zona waktu, Anda dapat mengetik datedi baris perintah untuk mengonfirmasi bahwa tanggal sudah benar sesuai harapan Anda.
mydoghasworms

Saya telah memulai ulang cron, tetapi masih menggunakan zona waktu lama (UTC)?
Luke Fisk-Lennon

Ini berhasil bagi saya pada 18.10. ~ $ date mengembalikan waktu yang benar. Harus menyukai antarmuka GUI gaya DOS berwarna cerah! Terima kasih.
itsricky

18

Tidak ada cara mudah untuk mencapai ini. cron menggunakan waktu setempat. /etc/default/crondan TZspesifikasi lain dalam crontab hanya menentukan apa yang TZharus digunakan untuk proses yang dimulai oleh cron, itu tidak mempengaruhi waktu mulai.

Sebagian besar solusi yang saya lihat melibatkan sebuah utilitas di tengah, jadi cron akan memulai sesuatu yang kemudian akan menentukan kapan untuk memulai di UTC (mis. Jika Anda tahu Anda hanya khawatir tentang perubahan DST, mulai saja 2 jam sebelumnya, hitung perbedaan waktu, dan mulai saja. Coba lihat at. Untuk melakukannya, orang sering menggunakan perlatau pythonatau bahasa skrip serupa).

Ada cara jahat untuk meretasnya jika Anda mau. cron hanya membaca info TZ dari sistem saat startup. Jadi jika ini adalah server yang terus berjalan, Anda bisa mengatur TZ ke UTC, reboot, dan setelah boot atur ke zona waktu lokal Anda. Anda juga bisa membuat skrip ini.

Sebagai pendekatan alternatif, lihat juga @rebootsintaks cron, yang harus menjalankan skrip setelah boot, yang terdengar seperti apa yang Anda inginkan.


14

Ada file yang mengontrol zona waktu sistem .. Saya baru saja mendapatkan masalah yang sama, berikut solusinya:

Jika Anda belum mengonfigurasi zona waktu secara manual, menjalankan dateharus menampilkan waktu UTC.

  • buat cadangan

    sudo cp /etc/localtime /etc/localtime.bkp
    
  • hapus file:

    sudo rm /etc/localtime
    
  • Saya tinggal di Chicago, (Anda mungkin perlu mengubah jalur, menggunakan bantuan tombol tab) jadi:

    sudo ln -s /usr/share/zoneinfo/America/Chicago /etc/localtime
    
  • Kemudian reboot. Ketika startup sistem Anda melakukan: date

  • sekarang zona waktu Anda seharusnya ada di sana sekarang, dan cron akan melihat ini.

FYI: mengatur variabel TZ adalah solusi sementara, dan terkadang bertindak sebagai "topeng".


1
+1 untuk solusi yang kompatibel dengan CentOS (dan EC2 Amazon Linux). Restart penuh mungkin ide yang bagus, tetapi bagi saya datebekerja tanpa me-reboot, dan bar restart OS sudo service crond restartsudah cukup untuk memperbaiki waktu pekerjaan cron saya.
davur

+1 Terima kasih ini berfungsi.
Jim

13

Pada Maret 2017, saya menemukan bahwa crond mendukung variabel CRON_TZ di setiap crontab.

Variabel CRON_TZ menentukan zona waktu khusus untuk tabel cron. Pengguna harus memasukkan waktu sesuai dengan zona waktu yang ditentukan ke dalam tabel. Waktu yang digunakan untuk menulis ke file log diambil dari zona waktu lokal, tempat daemon berjalan.

- kutipan dari halaman manual crontab (5)

Ini memungkinkan saya untuk menentukan waktu untuk mengeksekusi setiap cronjob dalam waktu lokal, yang secara otomatis dicatat untuk DST, sementara server tetap dalam UTC.


Saya juga menemukan tautan ini bermanfaat: serverfault.com/questions/848829/… . Untuk menemukan opsi zona waktu yang saya butuhkan, saya memasukkan ls /usr/share/zoneinfo/Americauntuk melihat opsi.
cheevahagadog

7

OK, saya mengambil waktu dan mencari cara untuk melakukan ini di Ubuntu Natty, dan inilah cara saya membuatnya bekerja. Mungkin ada cara yang lebih elegan, tetapi cara ini berhasil.

Pertama, kita perlu membungkus cron yang dapat dieksekusi dalam sebuah shell yang menetapkan variabel TZ. Begini caranya:

cd /usr/sbin
mv cron cron.real

Kemudian, buat file / usr / sbin / cron baru. Saya menggunakan vim, tetapi Anda dapat menggunakan editor yang Anda inginkan, cukup buat file seperti ini:

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

Jadikan file cron baru dapat dieksekusi:

chmod ugo+rx cron

Sekarang, restart daemon cron:

service cron restart

Pekerjaan cron Anda sekarang akan berjalan pada jadwal berbasis UTC - NAMUN, meskipun waktu mereka dieksekusi akan UTC, ketika mereka menjalankan mereka akan memiliki zona waktu yang ditetapkan untuk apa pun yang ditentukan untuk sistem. Untuk mengubahnya, letakkan ini di crontab Anda sebelum perintah apa pun:

TZ=UTC

Jadi crontab Anda akan terlihat seperti ini:

# 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
Apa gunanya mengatur TZ = UTC di dua tempat? Tidak bisakah Anda meletakkannya di file crontab?
Phương Nguyễn

Tidak. Menempatkan TZ = UTC dalam file crontab hanya menetapkannya untuk pekerjaan cron, bukan untuk cron itu sendiri. Itu tidak mempengaruhi waktu pelaksanaan pekerjaan.
Mark Reed

5
  1. Lihat /etc/default/cron. Anda dapat mengatur di TZsini untuk -all- crontab dan harus TZ=UTCiirc. Jadi metode Anda seharusnya berhasil.

  2. Lihatlah fcron . Anda dapat mengatur masing-masing crontab di zona waktu yang berbeda:

    timezone-name 'time zone of the system'

    Jalankan pekerjaan di zona waktu yang diberikan. timezone-name adalah string yang valid untuk variabel lingkungan TZ: lihat dokumentasi sistem Anda untuk lebih jelasnya. Misalnya, "Eropa / Paris" berlaku pada sistem Linux. Opsi ini menangani perubahan waktu musim panas dengan benar. Variabel lingkungan TZ diatur ke nilai zona waktu saat pekerjaan yang menentukan opsi ini dijalankan.

    Harap perhatikan bahwa jika Anda memberikan argumen nama-zona waktu yang salah, itu akan diabaikan secara diam-diam, dan pekerjaan akan berjalan di zona waktu sistem.


Yah saya memeriksanya dan crontab hanya berfungsi ketika saya mengatur waktu pemicu sebagai waktu lokal. Mengatur waktu ke UTC tidak berfungsi.
alj

baik 4 tahun kemudian dan saya mengintip file di / etc / default / cron dan ini sudah tidak berlaku lagi
the0ther

A downvote setelah 4 tahun? Ya ini tidak valid sekarang tetapi tidak kembali pada hari itu. Dan lagi, tidak ada pengguna 11.04 lagi, saya harap.
Rinzwind

3
Jika jawaban ini tidak valid, Anda mungkin harus menghapusnya; tidak ada gunanya menyimpan informasi yang salah di StackExchange. Bahwa digunakan untuk berada di-topik dan / atau yang benar adalah cukup banyak tidak relevan kepada siapa pun mengunjungi halaman ini untuk mencari informasi yang benar.
Quuxplusone

4

Silakan lihat posting saya berikutnya untuk solusi spesifik Ubuntu

Saya tahu ini adalah forum Ubuntu, tetapi saya yakin jawabannya akan sangat mirip dengan bagaimana Anda akan melakukan ini pada sistem Red Hat. Saya tidak memiliki sistem Ubuntu yang berguna untuk menguji ini, tetapi saya mengujinya di Red Hat.

Yang perlu Anda lakukan adalah menambahkan baris ke skrip daemon init cron Anda. Tetapkan dan ekspor variabel lingkungan TZ, seperti ini:

export TZ=UTC

Kemudian restart cron daemon Anda. Pastikan Anda meletakkan ekspor ini di skrip daemon cron start SETELAH setiap pengaturan variabel dan sumber - saya pikir ini mungkin mengapa edit poster asli /etc/default/cronskrip tidak bekerja untuknya. Mungkin dia mengaturnya, tetapi kemudian diatur ulang oleh sesuatu yang lain lebih jauh di skrip.

Perhatikan bahwa ini hanya akan memengaruhi daemon cron itu sendiri, dan bukan pekerjaan yang Anda jalankan melalui cron, jadi jika Anda ingin pekerjaan cron menggunakan UTC sebagai zona waktunya, Anda juga harus mengaturnya dalam pekerjaan itu sendiri.

Anda mungkin tidak dapat menyalin kata demi kata ini dan membuatnya berfungsi pada kotak Ubuntu, tetapi inilah skrip init yang saya gunakan untuk mengujinya di Red Hat. Anda akan menemukan ekspor tepat sebelum start()fungsi:

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

Baru tahu ini di Ubuntu 14/16. Bekerja dengan sempurna untuk saya.

Langkah-langkah (sudo tersirat):

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

Bagaimana dengan mengevaluasi waktu utc dalam skrip shell? Jadwalkan skrip shell untuk dijalankan setiap jam. Di bagian atas skrip, dapatkan jam UTC dari perintah tanggal. Jika bukan jam UTC yang Anda inginkan, keluarlah.

Script ini akan keluar jika tidak 1AM utc.

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

0

Anda dapat mengatur variabel lingkungan CRON_TZ Jika pekerjaan cron dijalankan pada server jarak jauh, Anda mungkin harus memperhatikan bahwa shell yang digunakan oleh crontab adalah sh . Anda dapat mengecek / etc / crontab .

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.