Phương pháp tốt để so sánh thời gian?


10

Tôi cần kiểm tra thời gian hiện tại và hủy bỏ tập lệnh nếu đó không phải là thời điểm thích hợp trong ngày tôi phải chạy nó. Ngoài ra, nếu bất cứ ai khác chạy nó, nó nên hủy bỏ.

Ví dụ: Tôi cần tập lệnh của mình chỉ chạy nếu nó được bắt đầu trong khoảng thời gian từ 10 giờ tối đến 2 giờ sáng (cửa sổ 4 giờ).

Hiện tại tôi đang làm như sau. Dành thời gian date +%k%Mvà so sánh với các số được mã hóa cứng

#!/bin/sh
currTime=`date +%k%M`
check_time_to_run()
{
    tempTime=$1
    if [ $tempTime -gt 200 -a $tempTime -lt 2200 ]; then 
        echo "Time is between 2 AM and 10 PM. Aborting."
        exit 1
    else
        echo "Time is after 10 PM and before 2 AM. Running normally."
    fi
}

check_time_to_run $currentTime

Tôi muốn biết liệu có phương pháp hiệu quả nào khác liên quan đến so sánh thời gian trong shhay bashkhông?


1
Nếu bạn cần so sánh hai ngày, hãy thử chuyển đổi chúng thành thời gian MJD hoặc UNIX, ví dụ : date +%s.
Eddy_Em

1
@Eddy không phải là ngày, đó là lúc tôi cần so sánh.
mtk

1
Tôi nghĩ rằng, chỉ trong vài giây nó sẽ là tốt hơn: currTime=$(date +%s); lower=$(date +%s --date="2:00"); upper=$(date +%s --date="22:00"); if [$currTime -gt $lower -a $currTime -lt $upper]; then...
Eddy_Em

Tại sao không đặt kịch bản trong crontab? bằng cách này, bạn đảm bảo rằng nó chạy vào thời điểm cụ thể đó
BitsOfNix

1
Vì bất kỳ người dùng nào cũng có thể thay đổi thời gian cho một quy trình faketime, tập lệnh của bạn không an toàn lắm. Sử dụng lockfiles có lẽ là một lựa chọn tốt hơn.
jofel

Câu trả lời:


6

Điều đó có vẻ hoàn hảo với tôi. Điều gì làm cho bạn nghĩ rằng nó nên được cải thiện?

Dù sao, cách để cải thiện nó có thể là:

  • Sử dụng một vỏ nhỏ hơn, nhanh hơn so với bash như dash hoặc pdksh.
  • sử dụng hệ vỏ có khả năng ngày tháng được tích hợp như zshhoặcksh93
  • sử dụng gawk(nhỏ hơn bash, nhưng không phải dấu gạch ngang nhưng có thể tránh được ngã ba thêm):

Thí dụ:

#! /usr/bin/gawk -f
BEGIN {now = strftime("%k%M")+0; exit(now > 200 && now < 2200)}

ok tuyệt Chỉ muốn xác nhận rằng những gì tôi đang làm không phải là thô thiển hay xấu xa. Cảm ơn những lời đề nghị.
mtk

4

Nếu các công cụ bên ngoài được cho phép, bạn có thể muốn kiểm tra dateutils.

"Kịch bản" của bạn trở thành:

if dtest time --gt '02:00:00' && dtest time --lt '22:00:00'; then
    echo "Time is between 2 AM and 10 PM. Aborting."
fi

Tuyên bố miễn trừ trách nhiệm: Tôi là tác giả của công cụ nói.

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.