Tengo problemas para comprender cómo verificar correctamente desde un script bash si la hora actual es entre las 23:00 y las 06:30. Estoy tratando de ejecutar un ciclo infinito para verificar la hora ahora y hacer algo si el rango de tiempo es entre las 11 p.m. y las 6:30 a.m. Esto es lo que he escrito hasta ahora, que no funciona al día siguiente:
fireup()
{
local starttime=$(date --date="23:00" +"%s")
local endtime=$(date --date="06:30" +"%s")
while :; do
local currenttime=$(date +%s)
if [ "$currenttime" -ge "$starttime" -a "$currenttime" -ge "$endtime" ]; then
do_something
else
do_something_else
fi
test "$?" -gt 128 && break
local currenttime=$(date +%s)
done &
}
¿Que estoy haciendo mal?
Respuestas:
Si todo lo que necesita es verificar si
HH:MM
es entre las 23:00 y las 06:30, no use las marcas de tiempo de Unix. Simplemente verifique losHH:MM
valores directamente:Notas:
HH:MM
será en orden lexicográfico, por lo que puede compararlos directamente como cadenas.-a
o-o
en[ ]
, use||
y en su&&
lugar.[[ ]]
sobre[ ]
, hace la vida más fácil.fuente
date
usar una zona horaria específica usando laTZ
variable (por ejemplo,TZ=Asia/Tokyo date
oTZ=UTC date +%H:%M
Si desea ser más explícito acerca de las veces que desea coincidir, puede usar una
case
declaración. Aquí hay un ciclo de 24 horas con una declaración de caso dentro que indica si la hora actual coincide con su rango:Para usarlo en su script, simplemente reemplace las variables con una llamada a
date
:Puede considerar ser más amigable con su CPU y calcular la cantidad de tiempo entre (ahora) y la próxima hora de inicio, y
sleep
durante esa cantidad de tiempo.fuente
Puede convertir el tiempo a segundos desde el inicio de "este" día y luego verificar que el valor de los segundos sea mayor que
23*60*60
(82800) o menor que6*60*60+30*60
(23400).Para obtener segundos desde el comienzo de "este" día puede hacer:
Y la prueba sería:
fuente
Tengo una situación similar. Mi objetivo es tener una solución que sea muy simple para los geeks que no son Unix.
Cuando mi servidor Linux se reinicia, ejecuta un script que envía una alerta. Pero si esto sucede como parte de nuestra "Ventana de mantenimiento", que se define entre las 11 p. M. El sábado y las 6 a. M. Del domingo, no quiero enviar la página, porque un reinicio durante esta ventana está bien (parches aplicados, etc.). Lo he probado y funciona según lo previsto (hasta donde puedo decir).
Aquí está el calendario de referencia:
Aquí está mi código de prueba:
Aquí está la salida
fuente
En este caso particular, una alternativa para simplificar la prueba es agregar una hora y probar una vez por menos de
07:30
fuente
Sugerencia: la respuesta de muru anterior funcionó para mí, pero en lugar de || (tuberías "o"), tuve que usar && ("y" operador).
así: si [["$ currenttime"> "23:00"]] && [["$ currenttime" <"06:30"]]
fuente