Belirli bir zamanın bir sonraki gerçekleşmesine kadar uyku


11

Bir dizi komut veya "4:00" gibi belirli bir zaman sonraki oluşumuna kadar uyur tek bir komut gerekir.

Bunu nasıl yaparım?

atKomutu veya bir cronjob ben şu anda olduğum senaryoyu terk etmemeli, çünkü bir seçenek değildir.

Bahsettiğim özel durum, ekranda çalışan bir betik. Komut dosyasının kendisi tarafından komut dosyasının yürütülmesini durdurmamam çok önemlidir, çünkü komut dosyasının bir noktasında ihtiyaç duyulan birçok önemli değişken vardır. Komut dosyasının her zaman normal bir konuda yürütülmesi gerekmez. Sadece belirli bir zamanda yürütülmesi gerekir.

Komut dosyasının herhangi bir dosya veya cronjobs veya diğer ekranlar gibi diğer görevleri oluşturması çok yapay olurdu. Bu sadece bir tasarım meselesidir.

Sadece harika bir fikrim vardı:

difference=$(($(date -d "4:00" +%s) - $(date +%s)))

if [ $difference -lt 0 ]
then
    sleep $((86400 + difference))
else
    sleep $difference
fi

Daha iyi fikirleriniz var mı?

Daha fazla bilgi istenirse eklenecektir!


Lütfen sorunuza biraz açıklık getirebilir misiniz? "Şu anda bulunduğum senaryoyu terk etmemeliyim" demekle ne demek istiyorsun
sebelk

Sen bir "uyandırma" dosyasının varlığını kontrol etmek ve tekrar kontrol etmeden önce bir süre uyumaya ne dersin? Daha sonra dosyayı oluşturmak için cron'u kullanabilirsiniz, cron'un güvenilirliğinden yararlanabilirsiniz, ancak uzun ömürlü komut dosyanız da olabilir. Sadece komut dosyası uyku modunu durdurduğunda "uyandırma" dosyasını kaldırmasını isteyin.
kurtm

Bir Mac'te date -dbununla date -jdeğiştirmeniz ve 4:00onunla değiştirmeniz gerektiğini unutmayın 0400.
pjvandehaar

Yanıtlar:


17

terdon'un önerisi işe yarayacaktı ama sanırım benimki daha verimli.

difference=$(($(date -d "4:00" +%s) - $(date +%s)))

if [ $difference -lt 0 ]
then
    sleep $((86400 + difference))
else
    sleep $difference
fi

Bu, verilen zaman ile şimdiki zaman arasındaki farkın saniye cinsinden hesaplanmasıdır. Sayı negatifse, uyumamız gereken saniyeleri elde etmek için bir gün boyunca saniye (86400 tam olarak) saniye eklemeliyiz ve sayı pozitifse sayı kullanabiliriz.


Sistem saati ileri / geri hareket ederse ne olur (örn: ntp).
WhyNotHugo

10

Bir kabuk betiği olduğunu varsayarsak, bu işe yaramalıdır:

while [ $(date +%H:%M) != "04:00" ]; do sleep 1; done

Bu 24 saattir. Bunun hem saat 04:00 hem de 16:00 arasında devam etmesini istiyorsanız bunun yerine şunu kullanın:

while [ $(date +%I:%M) != "04:00" ]; do sleep 1; done

Bu bir seçenek olabilir. Sadece bir fikrim vardı. Birkaç dakika içinde döneceğim.
BrainStone

0

On OpenBSD , şu bir sıkıştırmak için kullanılabilir */55 dakikalık crontab(5)bir içine işi 00(tam aralıklarla aynı görevi yerine getirirken, emin az e-postalar oluşturulan tüm yapmak) saatlik one:

#!/bin/sh -x
for k in $(jot 12 00 55)
  do
  echo $(date) doing stuff
  sleep $(expr $(date -j +%s $(printf %02d $(expr $k + 5))) - $(date -j +%s))
done

Dakikalar geçerli bir zaman olmadığından (son değilse!) Son yinelemede tasarımın date(1)da kırılacağını unutmayın , bu nedenle e-posta raporumuzu almadan önce ekstra zaman beklemek zorunda kalmayacağız.sleep(1)60

Ayrıca, yinelemelerden birinin kendisine tahsis edilmesi 5 dakikadan fazla sürerse, sleepaynı şekilde tasarımın hiç uyuyarak nezaketle başarısız olacağını da unutmayın (bir komut satırı seçeneği olarak yorumlanan negatif bir sayı nedeniyle, bir sonraki saat ve hatta sonsuzluk), böylece işinizin ayrılan saat içinde hala tamamlanabileceğinden emin olun (örneğin, yinelemelerden yalnızca biri 5 dakikadan biraz daha fazla sürerse, o zaman hala yetişmek için zamanımız olurdu, olmadan bir sonraki saate kadar olan herhangi bir şey).

Bu printf(1)gereklidir çünkü datedakika belirtimi için tam olarak iki basamak bekler.

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.