Làm thế nào để bạn thiết lập múi giờ cho crontab?


63

Tôi đã thiết lập thức dậy ACPI để máy tính xách tay của tôi thức dậy vào một thời điểm nhất định mỗi sáng. Múi giờ cho việc này là UTC. Tôi muốn thiết lập crontabs của mình cũng sử dụng UTC để chúng phù hợp với báo thức thức dậy.

Bạn làm nó như thế nào?

Tôi đã thử chỉnh sửa /etc/default/cronđể bao gồm:

TZ="UTC"

nhưng nó không hoạt động. (Tôi cũng đã thử TZ=UTCTZ="UTC/GMT")

Có ý kiến ​​gì không?


1
bạn đã làm một sudo service cron restartsau khi chỉnh sửa?
Rinzwind

1
Không ... nhưng tôi đã thử và nó không tạo ra sự khác biệt.
alj


Câu trả lời:


44

Tôi đã có một vấn đề tương tự trên Trusty (14.04). Đã giải quyết nó bằng cách đặt múi giờ của máy sau đó khởi động lại crondịch vụ

  1. sudo dpkg-reconfigure tzdata - làm theo hướng dẫn để chọn Vùng / Quốc gia
  2. sudo service cron restart

1
Sau khi đặt múi giờ, bạn có thể nhập datevào dòng lệnh để xác nhận rằng ngày đó là chính xác theo mong đợi của bạn.
mydoghasworms

Tôi đã khởi động lại cron, nhưng nó vẫn đang sử dụng múi giờ cũ (UTC)?
Luke Fisk-Lennon

Điều này làm việc liền mạch cho tôi vào ngày 18.10. ~ $ ngày trả về thời gian chính xác. Phải yêu những giao diện GUI phong cách DOS màu sáng! Cảm ơn.
itricky

18

Không có cách dễ dàng để đạt được điều này. cron sử dụng giờ địa phương. /etc/default/cronvà các TZthông số kỹ thuật khác trong crontab chỉ cần xác định những gì TZnên được sử dụng cho các quy trình được bắt đầu bởi cron, nó không ảnh hưởng đến thời gian bắt đầu.

Hầu hết các giải pháp tôi đã thấy liên quan đến một tiện ích ở giữa, vì vậy cron sẽ khởi động thứ gì đó sau đó sẽ xác định khi nào nên khởi động trong UTC (ví dụ: nếu bạn biết bạn chỉ quan tâm đến các thay đổi DST, hãy khởi động 2 giờ trước đó, tính toán chênh lệch thời gian và khởi động nó sau đó. Hãy xem at. Để làm như vậy, mọi người thường sử dụng perlhoặc pythonhoặc các ngôn ngữ kịch bản tương tự).

Có một cách khó chịu để hack nó nếu bạn muốn. cron chỉ đọc thông tin TZ khỏi hệ thống khi khởi động. Vì vậy, nếu đây là một máy chủ đang chạy, bạn có thể đặt TZ thành UTC, khởi động lại và sau khi khởi động, đặt nó thành múi giờ địa phương của bạn. Bạn có thể kịch bản này là tốt.

Là một cách tiếp cận khác, cũng có một cái nhìn về @rebootcú pháp của cron, sẽ thực thi các tập lệnh sau khi khởi động, nghe có vẻ như những gì bạn có thể muốn.


14

Có một tập tin kiểm soát múi giờ của hệ thống .. Tôi chỉ gặp vấn đề tương tự, đây là giải pháp:

Nếu bạn không cấu hình thủ công bất kỳ múi giờ nào, việc chạy datesẽ hiển thị thời gian UTC.

  • tạo một bản sao lưu

    sudo cp /etc/localtime /etc/localtime.bkp
    
  • xóa tệp:

    sudo rm /etc/localtime
    
  • Tôi sống ở Chicago, (bạn có thể cần thay đổi đường dẫn, sử dụng phím tab giúp) vì vậy:

    sudo ln -s /usr/share/zoneinfo/America/Chicago /etc/localtime
    
  • Sau đó khởi động lại. Khi hệ thống khởi động của bạn thực hiện: ngày

  • bây giờ múi giờ của bạn sẽ ở đó và cron sẽ xem xét điều này.

FYI: thiết lập biến TZ là một giải pháp tạm thời và đôi khi có thể đóng vai trò là "mặt nạ".


1
+1 cho giải pháp tương thích CentOS (và EC2 Amazon Linux). Khởi động lại đầy đủ có thể là một ý tưởng tốt, nhưng đối với tôi dateđã làm việc mà không cần khởi động lại và thanh khởi động lại hệ điều hành sudo service crond restartlà đủ để sửa chữa thời gian công việc định kỳ của tôi.
davur

+1 Cảm ơn nó đang hoạt động.
Jim

13

Kể từ tháng 3 năm 2017, tôi phát hiện ra rằng crond hỗ trợ biến CRON_TZ trong mỗi crontab.

Biến CRON_TZ chỉ định múi giờ cụ thể cho bảng cron. Người dùng nên nhập thời gian theo múi giờ đã chỉ định vào bảng. Thời gian được sử dụng để ghi vào tệp nhật ký được lấy từ múi giờ địa phương, nơi trình nền đang chạy.

- trích dẫn từ trang hướng dẫn crontab (5)

Điều này cho phép tôi chỉ định thời gian thực hiện mỗi cronjob theo giờ địa phương, tự động chiếm DST, trong khi máy chủ vẫn ở UTC.


Tôi cũng thấy liên kết này hữu ích: serverfault.com/questions/848829/ . Để tìm tùy chọn múi giờ tôi cần, tôi đã nhập ls /usr/share/zoneinfo/Americađể xem các tùy chọn.
cheevahagadog

7

OK, tôi đã dành chút thời gian và tìm ra cách để làm điều này trên Ubuntu Natty và đây là cách tôi làm cho nó hoạt động. Có thể có một cách thanh lịch hơn, nhưng cách này hoạt động.

Đầu tiên, chúng ta cần bọc cron thực thi trong một vỏ đặt biến TZ. Đây là cách thực hiện:

cd /usr/sbin
mv cron cron.real

Sau đó, tạo một tệp / usr / sbin / cron mới. Tôi đã sử dụng vim, nhưng bạn có thể sử dụng bất kỳ trình soạn thảo nào bạn muốn, chỉ cần làm cho tệp trông như thế này:

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

Làm cho tập tin cron mới thực thi:

chmod ugo+rx cron

Bây giờ, khởi động lại cron daemon:

service cron restart

Các công việc định kỳ của bạn bây giờ sẽ chạy theo lịch dựa trên UTC - TUY NHIÊN, mặc dù thời gian chúng được thực thi sẽ là UTC, khi chúng chạy, chúng sẽ có múi giờ được đặt thành bất cứ điều gì được xác định cho hệ thống. Để thay đổi điều đó, hãy đặt cái này vào crontab của bạn trước bất kỳ lệnh nào:

TZ=UTC

Vì vậy, crontab của bạn sẽ trông giống như thế này:

# 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
Điểm đặt TZ = UTC ở hai nơi là gì? Bạn có thể đặt nó trong tập tin crontab không?
Phương Nguyễn

Không. Đặt TZ = UTC vào tệp crontab chỉ đặt nó cho các công việc cron, không phải cho chính cron. Nó không ảnh hưởng đến thời gian thực hiện công việc.
Mark Reed

5
  1. Xem /etc/default/cron. Bạn có thể đặt TZở đây cho -all- crontabs và nó phải là TZ=UTCiirc. Vì vậy, phương pháp của bạn nên đã làm việc.

  2. Có một cái nhìn tại fcron . Bạn có thể đặt crontabs riêng lẻ theo các múi giờ khác nhau:

    timezone-name 'time zone of the system'

    Chạy công việc trong múi giờ nhất định. Tên múi giờ là một chuỗi hợp lệ cho biến môi trường TZ: xem tài liệu của hệ thống của bạn để biết thêm chi tiết. Ví dụ: "Châu Âu / Paris" hợp lệ trên hệ thống Linux. Tùy chọn này xử lý thay đổi thời gian tiết kiệm ánh sáng ban ngày một cách chính xác. Biến môi trường TZ được đặt thành giá trị của múi giờ khi một công việc xác định tùy chọn này được chạy.

    Xin lưu ý rằng nếu bạn đưa ra một đối số tên múi giờ sai, nó sẽ bị bỏ qua LỚN và công việc sẽ chạy trong múi giờ của hệ thống.


Vâng, tôi đã kiểm tra nó và crontab chỉ hoạt động khi tôi đặt thời gian kích hoạt là giờ địa phương. Đặt thời gian cho UTC chỉ không hoạt động.
alj

cũng 4 năm sau đó và tôi đã có một cái nhìn tại các tập tin / etc / default / cron và điều này được chính thức phản đối tại
the0ther

Một downvote sau 4 năm? Có, điều này không hợp lệ bây giờ nhưng nó đã không trở lại trong ngày. Sau đó, một lần nữa không ai là người dùng 11.04 nữa, tôi hy vọng.
Rinzwind

3
Nếu câu trả lời này không hợp lệ, có lẽ bạn nên xóa nó; không có ý định giữ thông tin sai lệch trên StackExchange. Rằng nó đã từng là chủ đề và / hoặc chính xác là không liên quan đến bất kỳ ai truy cập trang này để tìm kiếm thông tin chính xác.
Quuxplusone

4

Vui lòng xem bài viết tiếp theo của tôi để biết giải pháp dành riêng cho Ubuntu

Tôi biết đây là một diễn đàn Ubuntu, nhưng tôi tin rằng câu trả lời sẽ rất giống với cách bạn sẽ làm điều này trên hệ thống Red Hat. Tôi không có hệ thống Ubuntu tiện dụng để kiểm tra điều này, nhưng tôi đã thử nghiệm nó trên Red Hat.

Tất cả những gì bạn cần làm là thêm một dòng vào tập lệnh init cron daemon của bạn. Đặt và xuất biến môi trường TZ, như thế này:

export TZ=UTC

Sau đó khởi động lại cron daemon của bạn. Hãy chắc chắn rằng bạn đặt bản xuất này trong tập lệnh khởi động cron daemon SAU bất kỳ cài đặt và tìm nguồn biến nào khác - Tôi nghĩ rằng đây có thể là lý do tại sao bản chỉnh sửa /etc/default/cronkịch bản của người đăng ban đầu không hoạt động với anh ta. Có thể anh ta đặt nó, nhưng sau đó nó đã được thiết lập lại bởi một thứ khác trong kịch bản.

Lưu ý rằng điều này sẽ chỉ ảnh hưởng đến chính cron daemon chứ không ảnh hưởng đến các công việc bạn chạy qua cron, vì vậy nếu bạn muốn một công việc định kỳ sử dụng UTC làm múi giờ của nó, bạn cũng sẽ phải đặt nó vào công việc.

Bạn có thể không thể sao chép nguyên văn này và để nó hoạt động trên hộp Ubuntu, nhưng đây là tập lệnh init tôi đã sử dụng để kiểm tra điều này trên Red Hat. Bạn sẽ tìm thấy xuất ngay trước start()chức năng:

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

Chỉ cần tìm ra điều này trên Ubuntu 14/16. Làm việc hoàn hảo cho tôi.

Các bước (sudo ngụ ý):

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

Còn việc đánh giá thời gian utc trong kịch bản shell thì sao? Lịch trình kịch bản shell để chạy mỗi giờ. Ở đầu tập lệnh, lấy giờ UTC từ lệnh date. Nếu đó không phải là giờ UTC bạn muốn, hãy thoát.

Kịch bản này sẽ thoát nếu không phải là 1 giờ sáng.

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

0

Bạn có thể đặt biến môi trường CRON_TZ Nếu công việc định kỳ được chạy trên máy chủ từ xa, có lẽ bạn nên chú ý rằng trình bao được sử dụng bởi crontab là sh . Bạn có thể kiểm tra lại trên / etc / crontab .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.