0 10 * * 3 과 * 10 * * 3 의 차이는 분 필드에 있다
0 10 * * 3 은 한 번만 실행되고, * 10 * * 3 은 한 시간에 예순 번 실행된다. 분 필드를 읽고 필드 순서를 확인한 뒤 시계가 아니라 준비 상태를 기다려라.
두 표현 모두 수요일 아침처럼 보이지만, 한 번만이라는 뜻은 그중 하나뿐이다. 0 10 * * 3 은 수요일 10:00에 실행되고, * 10 * * 3 은 열 번째 시간의 매분 실행된다. 같은 터널을 시작할 기회가 예순 번 있다는 뜻이다. 명령이 기존 세션을 확인하지 않는 실행기라면 두 번째 표기는 일정 오류가 아니라 소유자를 경쟁시키는 루프다. 무엇보다 먼저 분 필드를 읽어라.
다섯 필드는 분, 시, 일, 월, 요일 순서이며, 첫 필드의 별표는 매분을 뜻한다.
분 필드가 횟수를 결정한다
맨 앞 숫자가 분이므로 0 10 * * 3 은 수요일 열 번째 시간의 첫 분이다. 이를 별표로 바꾸면 시와 요일은 그대로 두고 한 번만이라는 성질이 사라져 예순 건의 일치가 생긴다. cron은 중복을 제거하지 않는다. 일치할 때마다 명령이 다시 실행된다. 이것은 cron의 세부 사항이 아니라 필드의 의미론이며, 설치된 스케줄러의 참조 문서를 읽을 가치가 있다. 필드 순서와 선택적인 사용자 이름 열이 사용자용과 시스템용 crontab에서 다르기 때문이다.
하루 동안 자신의 타임스탬프를 기록하는 무해한 명령으로 시험해 보라. 로그에 한 줄이면 일정이고, 한 시간에 예순 줄이면 교훈이다.
두 번째 실행이 첫 번째 실행에 하는 일
예의 바른 실행기는 연결이 이미 올라와 있음을 알아차리고 아무것도 하지 않는다. 순수한 openvpn 호출은 그렇지 않다. 또 다른 프로세스를 만들고, 장치나 포트를 잡으려는 또 다른 시도를 만들며, 같은 목적지를 두고 경쟁하는 또 다른 경로 집합까지 만든다. NetworkManager에서는 한 연결에 대한 반복 활성화 요청이 보통 멱등이므로, 누군가 다른 명령을 쓰기 전까지 문제가 드러나지 않는다. 일정은 이미 터널을 관리하는 소유자에게 물어야 한다.
다음으로 연결이 맺어지는 중에 요청이 무엇을 뜻하는지 정하라. 중복 활성화도, 대기 중인 시작의 큐도 분명히 옳지 않다. 둘 중 하나를 골라 실행기가 구현하게 하고, 스케줄러가 우연히 결정하게 두지 마라.
명령 앞에서 필드를 세라
사용자용과 시스템용 crontab은 명령 앞에 사용자 이름 열이 있는지에서 다르다. 둘 사이를 복사한 항목은 잘못된 계정으로 실행되거나 사용자 이름을 명령의 첫 단어로 넘긴다. 안내서가 아니라 설치된 참조 문서를 확인하고, 자기 줄의 필드를 세라. 다섯 필드 항목 앞에 여섯 번째 단어가 있으면 시스템 crontab이고, 같은 줄을 사용자 crontab에 두면 그 단어를 프로그램으로 실행하려 한다.
실행 주체는 환경을 함께 지닌다. cron 작업은 잠금 해제된 키링도, 대화형 비밀번호 입력도, 시험한 작업 디렉터리도 물려받지 않는다.
시계가 아니라 준비 상태를 기다려라
성공적인 실행이 곧 동작하는 터널은 아니다. 작업이 끝날 때 클라이언트가 아직 엔드포인트를 해석하거나 인증하거나 경로를 설치하고 있을 수 있다. 의존 작업은 고정된 초 수가 아니라 실제로 필요한 보호 자원을, 상한이 있는 타임아웃과 기록되는 실패와 함께 기다려야 한다. 그 차이가 대체로 동작하는 일정과 바쁜 아침에 조용히 실패하는 일정을 가른다.
그 시간에 대화형 MFA가 필요하면 작업은 사람의 주의를 요청할 수는 있어도 응답을 제공할 수는 없다. 재사용 가능한 비밀번호를 넣거나 끝없이 재시도하는 대신 그 상황을 명시적으로 두어라.
정말 한 번뿐인 활성화에는 지원되는 단발 메커니즘을 써라. 기억해 두었다가 제거해야 하는 반복 규칙은 미래의 중복 실행이다.