Ці занадта рана запусціўся скрыпт up у OpenVPN, ці ён ніколі не быў гатовы?
Хук up запускаецца, калі з’яўляецца тунельнае прыстасаванне, раней за маршруты і гатоўнасць праграм. Падладзьце скрыпт пад падзею, якая яму патрэбна, замест дадання паўзы.
Скрыпт up запускаецца, выходзіць з кодам нуль, і задача ўнутры яго не можа дасягнуць прыватнай службы, якая праз дзве секунды цудоўна працуе з тэрмінала. Інстынкт падказвае праблему ў часе, і звычайнае выпраўленне — паўза, якая хавае гонку без разумення яе. Больш карыснае чытанне: “up” — гэта назва хука, а не гарантыя гатоўнасці. Ён спрацоўвае, калі тунельнае прыстасаванне наладжана, што раней за маршруты, DNS і, безумоўна, раней за любую праграму за тунелем.
Тэст у абалонцы прайшоў, бо ён выканаўся пасля таго, як усё ўладзілася. Хук выканаўся ў адзін канкрэтны момант.
Дзе up знаходзіцца ў парадку запуску
OpenVPN наладжвае тунельнае прыстасаванне і потым запускае хук up. Усталяванне маршрутаў — гэта пазнейшы этап, і ён мае свой уласны хук, таму задача, якая залежыць ад маршруту і змешчана ў up, можа ўбачыць прыстасаванне без карыснага шляху. Змясціце працу з маршрутамі ў route-up, і праблема часу звычайна знікае.
Кіраўніцтва дакументуе гэты парадак і асяроддзе, якое атрымлівае кожны хук. Гэты парадак — усё тлумачэнне класічнай скаргі “працуе з маёй абалонкі”, і менавіта таму адзін і той жа скрыпт можа прайсці на адной машыне і праваліцца на другой з больш павольным этапам маршрутаў. Ні адзін з вынікаў нічога не кажа пра якасць скрыпта.
Гатоўнасць DNS і праграм прыходзіць яшчэ пазней. Нават усталяваныя маршруты не з’яўляюцца доказам таго, што далёкі канец слухае, што імя вырашаецца або што для задачы, прывязанай да карыстальніка, існуе сеанс працоўнага стала.
Што хук насамрэч атрымлівае ў спадчыну
Хук працуе пад уліковым запісам і ў асяроддзі працэсу OpenVPN, што не тое самае, што ваша інтэрактыўная абалонка. Яму можа не хапаць шыны сеансаў карыстальніка, асяроддзя працоўнага стала або ўліковых даных, якія разблакоўваюцца толькі пры ўваходзе. Запішыце, што з гэтага задачы насамрэч патрэбна.
Гэта важна для задач, якія выглядаюць сеткавымі, але залежаць ад кантэксту карыстальніка: мантаванне агульнага рэсурсу з уліковымі данымі карыстальніка, наладка проксі для асобнага карыстальніка або наладка прынтара. Прывілеяваны хук тунеля — няправільнае месца для іх, і ніякая колькасць чакання не выправіць адсутны сеанс.
Калі задача ў хуку правальваецца, запішыце ўліковы запіс, асяроддзе і першую аперацыю, якая правалілася. Гэта аддзяляе заўчасны час ад праблемы дазволаў або кантэксту, а ў двух выпадках зусім розныя выпраўленні. Здагадкі паміж імі — гэта як выпраўленне на пяць хвілін ператвараецца ў цэлую пасляабедзенную пару.
Чаму даданне паўзы не з’яўляецца праверкай гатоўнасці
Паўза затрымлівае скрыпт і зрушвае акно гонкі. У хуткі дзень задача атрымліваецца; у павольны дзень яна зноў правальваецца, і збой робіцца цяжэй аднавіць, бо затрымка выглядае як працоўная. Затрымка, якая працуе толькі пад лёгкай нагрузкай, — гэта выпадак, а не выпраўленне.
Калі залежнасць — маршрут, выкарыстоўвайце хук, які адпавядае ўсталяванню маршруту. Калі залежнасць — служба за тунелем, выкарыстоўвайце абмежаваную праверку, якая чакае менавіта гэтую ўмову і ясна правальваецца, калі яна ніколі не надыходзіць.
Трымайце збой яўным. Хук, які выходзіць з нулём, калі яго фактычная праца правалілася, горш за хук, які правальваецца, бо менеджэр службаў запісвае поспех і ніхто больш не глядзіць. Радок журнала з самога скрыпта — самы танны спосаб захаваць гэта сумленна.
Прыборка і перападлучэнне заслугоўваюць такой жа ўвагі
Скрыпт, які змяняе агульны стан, патрабуе адпаведнага шляху адкату. Маршруты, запісы рэзалвера і адзнакі міжсеткавага экрана, дададзеныя хукам, павінны быць ідэмпатэнтнымі і зваротнымі, інакш перападлучэнне накладзе другую копію на першую.
Перападлучэнні таксама могуць запускаць хукі часцей, чым поўны запуск службы. Пастаянны інтэрфейс, які зноў усталёўвае сеанс, можа зноў выклікаць цыкл up і route-up, таму скрыпт, які мяркуе адно выкананне на кожную загрузку, рана ці позна пачне паводзіць сябе няправільна. Падлічыце выкананні ў журнале за дзень флапінгу, каб убачыць, як часта ён насамрэч запускаецца. Затым зрабіце скрыпт бяспечным для такога ліку запускаў.
Тэстуйце той жыццёвы цыкл, які праваліўся, а не пазнейшую каманду. Аднавіце загрузку або перападлучэнне, паназірайце за выкананнем хука і пацвердзіце, што задача атрымалася ў той момант, калі ён насамрэч працуе. Поспех з інтэрактыўнай абалонкі пасля гэтага — гэта доказ пра залежнасць, а не доказ таго, што шлях запуску працуе.
Назвіце падзею, ад якой залежыць кожная задача, затым прывяжыце яе да гэтай падзеі. Усё астатняе — затрымка, якая прыкідваецца праверкай.