Metode yang baik untuk membandingkan waktu?

10

Saya perlu memeriksa waktu saat ini dan membatalkan skrip jika itu bukan waktu yang tepat untuk menjalankannya. Juga, jika ada orang lain yang menjalankannya, itu harus dibatalkan.

Sebagai contoh: Saya perlu skrip saya untuk hanya berjalan jika dimulai antara 10 dan 2 pagi (jendela 4 jam).

Saat ini saya sedang melakukan hal berikut. Meluangkan waktu dengan date +%k%Mdan membandingkan dengan angka kode keras

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

Saya ingin tahu apakah ada metode lain yang efisien sehubungan dengan perbandingan waktu dalam shatau bash?

mtk
sumber
1
Jika Anda perlu membandingkan dua tanggal mencoba untuk mengkonversikannya ke MJD atau UNIX waktu, misalnya: date +%s.
Eddy_Em
1
@Eddy tidak, ini bukan tanggal, Ini saatnya saya harus membandingkan.
mtk
1
Saya pikir, dalam beberapa detik akan lebih baik: 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
mengapa tidak meletakkan skrip di crontab? dengan cara ini Anda memastikan bahwa itu berjalan pada waktu tertentu
BitsOfNix
1
Karena setiap pengguna dapat mengubah waktu proses faketime, skrip Anda tidak terlalu aman. Menggunakan file kunci mungkin merupakan opsi yang lebih baik.
jofel

Jawaban:

6

Itu terlihat sempurna bagi saya. Apa yang membuat Anda berpikir itu harus diperbaiki?

Bagaimanapun, cara untuk memperbaikinya bisa:

  • Gunakan shell yang lebih kecil dan lebih cepat daripada dasbor seperti bash atau pdksh.
  • gunakan shell yang memiliki kemampuan date builtin like zshatauksh93
  • gunakan gawk(yang lebih kecil dari bash, tetapi tidak dari dash tetapi bisa menghindari garpu tambahan):

Contoh:

#! /usr/bin/gawk -f
BEGIN {now = strftime("%k%M")+0; exit(now > 200 && now < 2200)}
Stéphane Chazelas
sumber
OK keren. Hanya ingin memastikan bahwa apa yang saya lakukan tidak kasar atau jahat. Terima kasih atas sarannya.
mtk
4

Jika alat eksternal diizinkan, Anda mungkin ingin memeriksa dateutils.

"Skrip" Anda menjadi:

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

Penafian: Saya adalah penulis alat tersebut.

hroptatyr
sumber