Crontab için saat dilimini nasıl ayarladınız?


63

ACPI uyanmasını ayarladım, böylece dizüstü bilgisayarım her sabah belirli bir saatte uyanıyor. Bunun için saat dilimi UTC'dir. UTC kullanarak crontab'larımı da kurmak istiyorum, böylece uyandırma alarmına uyacaklar.

Bunu nasıl yapıyorsun?

Eklemek /etc/default/croniçin düzenlemeyi denedim :

TZ="UTC"

ama işe yaramadı. (Ben de denedim TZ=UTCve TZ="UTC/GMT")

Herhangi bir fikir?


1
sudo service cron restartsonra bir düzenleme yaptın mı ?
Rinzwind

1
Hayır ... ama denedim ve bu bir fark yaratmadı.
alj


Yanıtlar:


44

Trusty'de de benzer bir sorun yaşadım (14.04). Makinenin saat dilimini ayarlayıp ardından cronhizmeti yeniden başlatarak çözüldü

  1. sudo dpkg-reconfigure tzdata - Bölge / Ülke seçmek için talimatları izleyin
  2. sudo service cron restart

1
Saat dilimini ayarladıktan sonra date, tarihin beklentinize göre doğru olduğunu onaylamak için komut satırına yazabilirsiniz .
mydoghasworms

Cron'u yeniden başlattım, ancak hala eski saat dilimini (UTC) kullanıyor mu?
Luke Fisk-Lennon

Bu benim için 18.10'da sorunsuz çalıştı. ~ $ tarih doğru zamanı döndürür. Bu parlak renkli DOS tarzı GUI arayüzlerini sevmeliyim! Teşekkürler.
itsricky

18

Bunu başarmanın kolay bir yolu yoktur. cron yerel saati kullanır. /etc/default/cronve TZcrontab'daki diğer özellikler, TZcron tarafından başlatılan işlemler için neyin kullanılması gerektiğini belirtir , başlangıç ​​saatini etkilemez.

Gördüğüm çözümlerin çoğu ortada bir yardımcı program içeriyor, bu nedenle cron UTC'ye ne zaman başlayacağını belirleyecek bir şeyi başlatacak (örneğin, yalnızca DST değişikliklerinden endişe duyduğunuzu biliyorsanız, 2 saat önce fırlatıp hesaplayın, zaman farkına varın ve sonra başlayın, bakın. Bir göz atın at. Bunu yapmak için, insanlar genellikle perlya pythonda benzer betik dilleri kullanırlar).

İstersen hacklemenin kötü bir yolu var. cron TZ bilgisini sadece başlangıçta sistemden okur. Böylece, bu sürekli çalışan bir sunucuysa, TZ'yi UTC'ye ayarlayabilir, yeniden başlatabilir ve önyüklemeden sonra yerel saatinize ayarlayabilirsiniz. Bunu da senaryo ile yazabilirsiniz.

Alternatif bir yaklaşım olarak, @rebootönyüklemeden sonra komutları yürütmesi gereken, istediğiniz gibi ses çıkaran cron'un sözdizimine de bakın .


14

Sistem saat dilimini kontrol eden bir dosya var. Aynı sorunu yeni gördüm, işte çözümü:

Herhangi bir saat dilimini manuel olarak yapılandırmadıysanız, çalıştırma dateUTC zamanını göstermelidir.

  • yedek oluştur

    sudo cp /etc/localtime /etc/localtime.bkp
    
  • dosyayı kaldır:

    sudo rm /etc/localtime
    
  • Şikago'da yaşıyorum, (yolu değiştirmeniz gerekebilir, sekme tuşlarını kullanarak yardımcı olabilir).

    sudo ln -s /usr/share/zoneinfo/America/Chicago /etc/localtime
    
  • Ardından yeniden başlatın. Sistem başlangıcınız gerçekleştirdiğinde: tarih

  • Şimdi saat diliminiz şimdi orada olmalı ve cron buna bakacak.

Bilginize: TZ değişkenini ayarlamak geçici bir çözümdür ve bazen "maske" işlevi görebilir.


1
CentOS uyumlu bir çözüm için +1 (ve EC2 Amazon Linux). Tam bir yeniden başlatma iyi bir fikir olabilir, ancak benim için dateyeniden başlatmadan çalıştı ve işletim sistemi yeniden başlatmayı sudo service crond restartengellemek, cron iş zamanlarımı düzeltmek için yeterliydi.
davur

+1 Teşekkürler çalışıyor.
Jim,

13

Mart 2017 itibariyle, crond'un her crontab'taki CRON_TZ değişkenini desteklediğini keşfettim.

CRON_TZ değişkeni, cron tablosu için belirli bir saat dilimini belirtir. Kullanıcı, belirtilen zaman dilimine göre tabloya bir zaman girmelidir. Bir günlük dosyasına yazmak için kullanılan saat, arka plan programının çalıştığı yerel saat diliminden alınır.

- crontab (5) manual sayfasından alıntı

Bu, sunucu UTC'de kalırken otomatik olarak DST'yi hesaba katan her cronjob'ı yerel saatte yürütme zamanını belirlememe izin verdi.


Ayrıca bu bağlantıyı yararlı buldum: serverfault.com/questions/848829/… . Zaman dilimini bulmak için gerekli ls /usr/share/zoneinfo/Americaseçenekleri görmek için girdim .
cheevahagadog

7

Tamam, biraz zaman aldım ve bunun Ubuntu Natty'de nasıl yapıldığını öğrendim ve işte nasıl çalıştığımı anladım. Daha zarif bir yol olabilir, ancak bu şekilde çalışır.

Öncelikle, cron dosyasını TZ değişkenini ayarlayan bir kabuğa sarmamız gerekiyor. İşte nasıl:

cd /usr/sbin
mv cron cron.real

Sonra yeni bir / usr / sbin / cron dosyası oluşturun. Vim kullandım, ancak istediğiniz herhangi bir düzenleyiciyi kullanabilirsiniz, dosyayı şöyle görünmesini sağlayın:

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

Yeni cron dosyasını çalıştırılabilir hale getirin:

chmod ugo+rx cron

Şimdi cron arka planını yeniden başlatın:

service cron restart

Artık cron işleriniz UTC tabanlı bir programda çalışacak - NASIL, yürütüldükleri zaman UTC olsa bile, çalıştıklarında sistem için tanımlanmış olan zaman dilimini ayarlayacaklar. Bunu değiştirmek için, herhangi bir komuttan önce crontab'ınıza koyun:

TZ=UTC

Yani crontab'ınız şöyle görünecek:

# 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
İki yerde TZ = UTC ayar noktası nedir? Sadece crontab dosyasına koyamaz mısın?
Phễng Nguyễn

Hayır. TZ = UTC'yi crontab dosyasına koymak cron için değil, yalnızca cron işleri için ayarlar. İş yürütmenin zamanlamasını etkilemez.
Mark Reed,

5
  1. Bakın /etc/default/cron. TZAll-crontabs için burada ayarlayabilirsiniz ve TZ=UTCiirc olmalıdır . Yani yönteminiz işe yaramalıydı.

  2. Fcron'a bir bakın . Tek tek crontab'ları farklı zaman dilimlerinde ayarlayabilirsiniz:

    timezone-name 'time zone of the system'

    İşi verilen saat diliminde yürütün. timezone-name, TZ ortam değişkeni için geçerli bir dizedir: daha fazla ayrıntı için sisteminizin belgelerine bakın. Örneğin, "Avrupa / Paris" bir Linux sisteminde geçerlidir. Bu seçenek, gün ışığından yararlanma saati değişikliklerini doğru olarak yapar. Bu seçeneği tanımlayan bir iş yapıldığında, TZ ortamı değişkeni zaman diliminin değerine ayarlanır.

    Hatalı bir saat dilimi adı argümanı verirseniz, SESSİZ olarak göz ardı edileceğini ve işin sistemin saat diliminde çalışacağını lütfen unutmayın.


Kontrol ettim ve crontab sadece tetikleme zamanını yerel zaman olarak ayarladığımda çalışıyor. UTC'ye zaman ayarlamak sadece işe yaramıyor.
alj

4 yıl sonra ve / etc / default / cron dosyasına bir göz
attım

4 yıl sonra bir düşüş? Evet, bu şu anda geçersiz, ancak güne dönmedi. O zaman tekrar kimse artık 11.04 kullanıcısı değil, umarım.
Rinzwind,

3
Bu cevap geçersizse, büyük olasılıkla silmelisiniz; StackExchange'te yanlış bilgi edinmenin hiçbir anlamı yoktur. O kullanılan hemen hemen alakasız doğru bilgi toplamak amacıyla bu sayfayı ziyaret herkese olduğu konuyla ve / veya doğru olduğu.
Quuxplusone

4

Ubuntu'ya özgü bir çözüm için lütfen bir sonraki yayına bakın

Bunun bir Ubuntu forumu olduğunu biliyorum, ancak cevabın Red Hat sisteminde bunu nasıl yapacağınıza çok benzeyeceğine inanıyorum. Bunu test etmek için kullanışlı bir Ubuntu sistemim yok ama Red Hat'ta test ettim.

Tek yapmanız gereken, cron daemon init betiğine bir satır eklemek. TZ ortam değişkenini şu şekilde ayarlayın ve verin:

export TZ=UTC

Ardından cron daemon'unuzu yeniden başlatın. Başka bir değişken ayar ve kaynak işleminden sonra bu dışa aktarmayı cron cini başlat komut dosyasına koyduğunuzdan emin olun - orijinal posterin /etc/default/cronkomut dosyasını düzenlemesinin kendisi için işe yaramadığının nedeni olabilir. Belki o ayarladı, ama sonra senaryoda daha başka bir şey tarafından sıfırlandı.

Bunun yalnızca cron arka planının kendisini etkileyeceğini ve cron üzerinden çalıştırdığınız işleri etkilemeyeceğini unutmayın; bu nedenle, bir cron işinin UTC'yi zaman dilimi olarak kullanmasını istiyorsanız, işi de kendi başına ayarlamanız gerekir.

Muhtemelen bu sözlü kopyayı kopyalayamaz ve bir Ubuntu kutusunda çalıştırabilirsin, ama işte Red Hat'ta bunu test etmek için kullandığım init betiği. Dışa aktarma start()işlevinden hemen önce bulunur :

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

Bunu sadece 14/16 Ubuntu'da anladım. Benim için mükemmel çalıştı.

Adımlar (sudo ima edildi):

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 zamanını bir kabuk betiğinde değerlendirmeye ne dersiniz? Her saat başı çalışacak şekilde kabuk betiğini programlayın. Komut dosyasının en üstünde tarih komutundan UTC saatini alın. İstediğiniz UTC saati değilse, çıkın.

Bu script 1 am utc değilse çıkacaktır.

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

0

CRON_TZ ortam değişkenini ayarlayabilirsiniz. Eğer cron işi uzak bir sunucuda çalışıyorsa, muhtemelen crontab tarafından kullanılan kabuğun sh olduğunu fark etmelisiniz . / Etc / crontab dosyasını iki kere kontrol edebilirsiniz .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.