¿Cuál es la mejor manera de realizar una comparación de marca de hora en Bash?
Pregunta
Tengo un script de alerta que trato de evitar que me envíen correos no deseados, por lo que me gustaría establecer una condición para que, si se ha enviado una alerta dentro de, digamos la última hora, para no enviar otra alerta. Ahora tengo un trabajo cron que revisa la condición cada minuto porque necesito que me avisen rápidamente cuando se cumpla la condición, pero no necesito recibir el correo electrónico cada munite hasta que tenga el problema bajo control. ¿Cuál es la mejor manera de comparar el tiempo en bash para lograr esto?
Solución
Por mucho, lo más fácil es almacenar sellos de tiempo como tiempos de modificación de archivos ficticios. Los comandos GNU touch
y date
pueden establecer / obtener estos horarios y realizar cálculos de fecha. Bash tiene pruebas para verificar si un archivo es más reciente que ( -nt
) o más antiguo que ( -ot
) otro.
Por ejemplo, para enviar una notificación solo si la última notificación fue hace más de una hora:
touch -d '-1 hour' limit
if [ limit -nt last_notification ]; then
#send notification...
touch last_notification
fi
Otros consejos
Utilice " prueba " ;:
if test file1 -nt file2; then
# file1 is newer than file2
fi
EDITAR: si desea saber cuándo ocurrió un evento, puede usar " toque " para crear un archivo que pueda comparar más tarde utilizando " prueba " ;.
Use el comando de fecha para convertir los dos tiempos en un formato estándar y restarlos. Probablemente querrá almacenar el tiempo de ejecución anterior en un archivo de puntos y luego hacer algo como:
last = cat /tmp/.lastrun
curr = date '+%s'
diff = $(($curr - $last))
if [ $diff -gt 3600 ]; then
# ...
fi
echo "$curr" >/tmp/.lastrun
(Gracias, Steve.)