Potrzebuję serii poleceń lub pojedynczego polecenia, które śpi aż do następnego wystąpienia określonego czasu, takiego jak „4:00”.
Jak mam to zrobić?
at
Polecenie lub zadanie crona nie jest opcją, bo nie musi opuścić skrypt jestem obecnie.
Konkretny przypadek, o którym mówię, to skrypt działający na ekranie. Bardzo ważne jest, aby nie przerywać wykonywania skryptu przez sam skrypt, ponieważ istnieje wiele ważnych zmiennych, które są potrzebne w pewnym momencie skryptu. Skrypt nie zawsze powinien być wykonywany regularnie. Musi zostać wykonany w określonym czasie.
Byłoby bardzo szkodliwe, gdyby skrypt musiał utworzyć jakiekolwiek pliki lub inne zadania, takie jak cronjobs lub inne ekrany. To po prostu kwestia projektu.
Właśnie miałem niesamowity pomysł:
difference=$(($(date -d "4:00" +%s) - $(date +%s)))
if [ $difference -lt 0 ]
then
sleep $((86400 + difference))
else
sleep $difference
fi
Czy masz jakieś lepsze pomysły?
Więcej informacji zostanie dodanych na żądanie!
date -d
zdate -j
i zamienić4:00
z0400
.Odpowiedzi:
Sugestia terdona zadziałałaby, ale chyba moja jest bardziej wydajna.
Oblicza różnicę między podanym czasem a bieżącym czasem w sekundach. Jeśli liczba jest ujemna, musimy dodać sekundy na cały dzień (dokładnie 86400), aby uzyskać sekundy, które musimy spać, a jeśli liczba jest dodatnia, możemy jej po prostu użyć.
źródło
Zakładając, że jest to skrypt powłoki, powinno to działać:
To 24 godziny. Jeśli chcesz, aby trwało to zarówno o 4:00, jak i 16:00, użyj tego:
źródło
W OpenBSD można użyć następujących rzeczy do skompresowania
*/5
5-minutowegocrontab(5)
zadania do zadania00
godzinowego (aby upewnić się, że generowanych jest mniej wiadomości e-mail, a wszystkie wykonują to samo zadanie w dokładnych odstępach czasu):Pamiętaj, że przy ostatniej iteracji złamałoby
date(1)
to równieżsleep(1)
projekt, ponieważ60
minuty nie są poprawnym czasem (chyba że tak!), Dlatego nie będziemy musieli czekać więcej czasu przed otrzymaniem naszego raportu e-mail.Zwróć też uwagę, że jeśli jedna z iteracji zostanie poświęcona na więcej niż 5 minut,
sleep
również łaskawie zawiedzie z założenia, nie śpiąc wcale (z powodu liczby ujemnej interpretowanej jako opcja wiersza poleceń, zamiast owijania się w następnej godziny lub nawet wieczności), upewniając się w ten sposób, że twoja praca może zostać ukończona w wyznaczonej godzinie (np. jeśli tylko jedna z iteracji zajmie trochę więcej niż 5 minut, wtedy będziemy mieli czas na nadrobienie zaległości, bez wszystko zawija się do następnej godziny).Jest
printf(1)
to konieczne, ponieważdate
oczekuje dokładnie dwóch cyfr dla specyfikacji minutowej.źródło