El aviso apareció veinte minutos después de conectar. El contador de debajo llevaba funcionando desde la mañana anterior, o desde la última autenticación de la cuenta, y nada en la alerta decía cuál. Ese es el síntoma: un recordatorio atado a algo distinto de la conexión que tiene delante.

La solución no es una alerta mejor. Es decidir qué reloj quiere decir el requisito y después atar el temporizador a un objeto que exista en ese reloj.

Qué se disparó y qué contaba

Tres fuentes plausibles producen el mismo mensaje. Una regla de calendario se ejecuta a una hora local fija y no sabe nada de túneles. Un contador en el cliente se acumula mientras cualquier conexión está activa y sobrevive a las reconexiones. Una política de puerta de enlace caduca la sesión en el lado del servidor y envía primero un aviso.

Solo las dos últimas tratan de una sesión, y ni siquiera esas coinciden. El contador del cliente mide lo que observó el proceso local; la puerta de enlace mide lo que autenticó y contabilizó. Una suspensión, un cambio de red o un reinicio del observador pueden separarlos por horas, y por eso el aviso y la caducidad forzada se alejan.

Tres relojes detrás de un requisito

Empiece por escribir la frase que realmente quiere. Avisar antes de que la puerta de enlace termine esta conexión no es el mismo requisito que recordar tras un día de tiempo conectado. Tampoco es lo mismo que informar de que esta sesión lleva 23 horas en pie. Cada versión nombra un suceso distinto, y un componente distinto tiene que responder.

Luego compruebe si los datos existen. Una marca de tiempo local de inicio le da la edad de la sesión sin depender del servidor. Una política de puerta de enlace le da la vida restante, pero solo si la puerta de enlace la expone. Un informe de uso le da la duración a posteriori, y eso no puede impulsar un aviso previo.

Ate el temporizador a la sesión, no a la cuenta

Elija primero el objeto. Una cuenta puede tener varios dispositivos y varias sesiones simultáneas, así que un recordatorio ligado al nombre de usuario no puede decir qué conexión alcanzó la edad. Átelo al perfil más esa activación, y cancele el aviso pendiente cuando la activación termine.

Evidence you can readWhat it establishesWhere it misleads
Connection state changes to activeA session started nowDoes not carry the gateway's own session identifier
Duration reported at disconnectTotal service time for that sessionArrives too late for any advance notice
Interim usage updateTime accounted up to that updateStaleness equals the update interval
Local timestamp taken at activationAge of your observationResets whenever the observer restarts

Esa tabla es un contrato para su propio notificador, no una descripción de la API de devolución de llamada de ningún cliente. Lo que el producto instalado documente sobre el estado de la conexión es la fuente a la que atarse; donde solo exponga eventos de autenticación, dígalo en voz alta y acepte el comportamiento más grueso en lugar de inferir una sesión.

Pruébelo con un umbral corto

Nunca depure un temporizador de un día con una espera de un día. Añada un umbral configurable, póngalo en treinta segundos y ejecute cuatro transiciones en orden: conectar, esperar, desconectar, reconectar. Cada transición debe producir exactamente un cambio de estado, y la reconexión debe programar un plazo nuevo en vez de heredar el viejo.

# current connection state and profile identity
nmcli -f GENERAL.STATE,GENERAL.CONNECTION connection show work

# the notifier unit you wrote: does it restart the deadline or resume it?
journalctl --user -u vpn-timer.service --since "-5 min" -o cat

Mire las marcas de tiempo, no la redacción. Un aviso que llega con la hora de inicio de la sesión anterior ató el objeto equivocado, y un aviso que llega dos veces para un plazo significa que la marca de envío nunca se guardó.

Suspensión, reconexión y entrega perdida

La suspensión rompe los dos diseños ingenuos. Una cuenta atrás monótona se detiene mientras la máquina duerme, un plazo de reloj de pared sigue avanzando, y un temporizador que se dispara durante la suspensión se entrega tarde o no se entrega. Decida qué comportamiento necesita su requisito, luego suspenda la máquina más allá del umbral y confírmelo.

La entrega merece el mismo cuidado. Si el aviso no se puede mostrar, póngalo en cola y vuelva a comprobar que la sesión objetivo sigue existiendo antes de mostrarlo por fin; si no, se avisa al usuario de una conexión que ya terminó. La desconexión forzada y la renovación de credenciales quedan fuera de este camino, porque un recordatorio que cambia en silencio el destino de la conexión es una decisión de política vestida de aviso.

Artículos relacionados