Защо 23-часово напомняне за VPN се задейства за грешната сесия
Известие за 23 часа трябва да следва една сесия, а не акаунта. Вържете таймера към връзката, която е започнала, и третирайте заспиването и повторното свързване като отделни случаи.
Известието се появи двадесет минути след свързването. Броячът под него работеше от предната сутрин или от последното удостоверяване на акаунта и нищо в предупреждението не казваше кое от двете. Това е симптомът: напомняне, вързано за нещо друго, а не за връзката пред вас.
Решението не е по-добро предупреждение. То е да решите кой часовник има предвид изискването и след това да вържете таймера към обект, който съществува в този часовник.
Какво се задейства и какво броеше
Три вероятни източника дават едно и също съобщение. Правило в календара работи във фиксирано местно време и не знае нищо за тунели. Брояч в клиента се натрупва, докато има връзка, и преживява повторни свързвания. Политика на шлюза изтича сесията от страната на сървъра и първо изпраща предупреждение.
Само последните две се отнасят за сесия и дори те не са съгласни. Броячът на клиента измерва какво е наблюдавал местният процес; шлюзът измерва какво е удостоверил и отчел. Заспиване, смяна на мрежата или рестартиране на наблюдателя могат да ги разделят с часове и затова предупреждението и принудителното изтичане се разминават.
Три часовника зад едно изискване
Започнете, като запишете изречението, което наистина искате. Предупреждение, преди шлюзът да прекрати тази връзка, не е същото изискване като напомняне след денонощие свързано време. Не е същото и като отчитане, че тази сесия е активна от 23 часа. Всяка версия назовава различно събитие и различен компонент трябва да отговаря за него.
След това проверете дали данните съществуват. Местен начален печат на времето ви дава възрастта на сесията без зависимост от сървъра. Политика на шлюза ви дава оставащия срок, но само ако шлюзът я предоставя. Отчет за използване ви дава продължителност след факта, а това не може да задвижи предварително известие.
Вържете таймера към сесията, а не към акаунта
Първо изберете обекта. Един акаунт може да държи няколко устройства и няколко едновременни сесии, така че напомняне, вързано за потребителското име, не може да каже коя връзка е достигнала възрастта. Вържете го към профила плюс това активиране и отменете чакащото известие, когато активирането приключи.
| Evidence you can read | What it establishes | Where it misleads |
|---|---|---|
| Connection state changes to active | A session started now | Does not carry the gateway's own session identifier |
| Duration reported at disconnect | Total service time for that session | Arrives too late for any advance notice |
| Interim usage update | Time accounted up to that update | Staleness equals the update interval |
| Local timestamp taken at activation | Age of your observation | Resets whenever the observer restarts |
Тази таблица е договор за вашия собствен уведомител, а не описание на API за обратни извиквания на който и да е клиент. Каквото инсталираният продукт документира за състоянието на връзката, това е източникът, към който да се вържете; където той показва само събития по удостоверяване, кажете го на глас и приемете по-грубото поведение, вместо да предполагате сесия.
Тествайте с кратък праг
Никога не отстранявайте грешки в денонощен таймер с денонощно чакане. Добавете конфигурируем праг, задайте го на тридесет секунди и изпълнете четири прехода по ред: свързване, изчакване, прекъсване, повторно свързване. Всеки преход трябва да даде точно една промяна на състоянието, а повторното свързване трябва да насрочи нов краен срок, вместо да наследи стария.
# 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
Гледайте печатите на времето, а не формулировката. Известие, което пристига с началния час на предишната сесия, е вързало грешния обект, а известие, което пристига два пъти за един краен срок, означава, че флагът за изпращане никога не е бил запазен.
Заспиване, повторно свързване и пропусната доставка
Заспиването чупи и двата наивни дизайна. Монотонното обратно броене спира, докато машината спи, крайният срок по стенния часовник продължава да се движи, а таймер, който се задейства по време на заспиване, се доставя късно или изобщо не се доставя. Решете какво поведение изисква вашето изискване, след което заспите машината през прага и го потвърдете.
Доставката заслужава същото внимание. Ако известието не може да се покаже, поставете го в опашка и проверете отново дали целевата сесия още съществува, преди най-накрая да го покажете; иначе потребителят е предупреден за връзка, която вече е приключила. Принудителното прекъсване и подновяването на идентификационните данни остават извън този път, защото напомняне, което тихо променя съдбата на връзката, е политическо решение, облечено като известие.