알림은 연결한 지 이십 분 뒤에 나타났습니다. 그 아래의 카운터는 전날 아침부터, 또는 계정이 마지막으로 인증한 시점부터 돌고 있었고, 경고 어디에도 어느 쪽인지 쓰여 있지 않았습니다. 이것이 증상입니다. 눈앞의 연결이 아닌 다른 무언가에 묶인 알림입니다.

해법은 더 나은 경고가 아닙니다. 요구 사항이 어느 시계를 뜻하는지 정하고, 그 시계 안에 존재하는 대상에 타이머를 묶는 것입니다.

무엇이 울렸고 무엇을 세고 있었나

세 가지 그럴듯한 원천이 같은 메시지를 만듭니다. 캘린더 규칙은 고정된 현지 시각에 돌고 터널에 대해 아무것도 모릅니다. 클라이언트의 카운터는 어떤 연결이든 살아 있는 동안 쌓이고 재연결을 넘어 살아남습니다. 게이트웨이 정책은 서버 쪽에서 세션을 만료시키고 먼저 경고를 보냅니다.

세션을 말하는 것은 마지막 두 가지뿐이고, 그 둘도 서로 맞지 않습니다. 클라이언트 카운터는 로컬 프로세스가 관찰한 것을 재고, 게이트웨이는 인증하고 계산한 것을 잽니다. 절전, 네트워크 변경, 감시자 재시작은 둘을 몇 시간씩 갈라놓을 수 있고, 그래서 경고와 강제 만료가 어긋납니다.

하나의 요구 사항 뒤에 있는 세 개의 시계

먼저 정말로 원하는 문장을 적으십시오. 게이트웨이가 이 연결을 끝내기 전에 경고하는 것은 하루의 연결 시간이 지난 뒤 상기시키는 것과 같은 요구 사항이 아닙니다. 이 세션이 23시간째 살아 있다고 보고하는 것과도 다릅니다. 각 판본은 다른 사건을 지목하고, 다른 구성 요소가 그것에 답해야 합니다.

다음으로 데이터가 있는지 확인하십시오. 로컬 시작 타임스탬프는 서버에 의존하지 않고 세션의 나이를 줍니다. 게이트웨이 정책은 남은 수명을 주지만, 게이트웨이가 그것을 노출할 때만 그렇습니다. 사용 보고서는 사후에 기간을 주고, 그것으로는 사전 알림을 움직일 수 없습니다.

타이머를 계정이 아니라 세션에 묶으십시오

먼저 대상을 고르십시오. 계정은 여러 기기와 여러 동시 세션을 담을 수 있으므로 사용자 이름에 걸린 알림은 어느 연결이 그 나이에 이르렀는지 말할 수 없습니다. 프로필과 그 활성화에 걸고, 활성화가 끝나면 대기 중인 알림을 취소하십시오.

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

그 표는 자신의 알림기용 계약이며, 어떤 클라이언트의 콜백 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

문구가 아니라 타임스탬프를 보십시오. 이전 세션의 시작 시각을 달고 오는 알림은 잘못된 대상에 묶인 것이고, 한 기한에 두 번 오는 알림은 보냄 플래그가 한 번도 저장되지 않았다는 뜻입니다.

절전, 재연결, 그리고 놓친 전달

절전은 두 순진한 설계를 모두 깨뜨립니다. 단조 카운트다운은 기계가 자는 동안 멈추고, 벽시계 기한은 계속 움직이며, 절전 중에 발화한 타이머는 늦게 또는 전혀 전달되지 않습니다. 요구 사항에 어느 동작이 필요한지 정하고, 임계값을 넘겨 기계를 재운 뒤 확인하십시오.

전달에도 같은 주의가 필요합니다. 알림을 표시할 수 없다면 대기열에 넣고, 마지막으로 표시하기 전에 대상 세션이 아직 있는지 다시 확인하십시오. 그렇지 않으면 이미 끝난 연결에 대해 사용자에게 경고하게 됩니다. 강제 연결 해제와 자격 증명 갱신은 이 경로 밖에 둡니다. 연결의 운명을 조용히 바꾸는 알림은 알림의 옷을 입은 정책 결정이기 때문입니다.

관련 글