Traceback է հայտնվում, երբ սկսվում է VPN-ի կառավարման հրահանգ, և առաջին բնազդն է տեղադրել այլ Python կամ համակարգի լռելյայնը ուղղել այլ տեղ։ Այդ բնազդը խառնում է երկու գործարկման միջավայր, որոնք ոչ մի կապ չունեն իրար հետ։ Մեկը պատկանում է օպերացիոն համակարգին և նրա փաթեթավորված գործիքներին, մյուսը՝ ցանկացած նախագծի, որը դուք կառուցում եք։ Առաջինը փոխելը երկրորդին գոհացնելու համար այն ուղին է, որով աշխատող աշխատասեղանը կորցնում է իր փաթեթների կառավարիչը։

Համեմատությունը, որն արժե անել, իրականում ձախողված բաղադրիչի և այն գործարկման միջավայրի միջև է, որը դուք իրավունք ունեք փոխելու։ Դրանք գրեթե երբեք նույն օբյեկտը չեն։

Երկու Python հարց, որոնք նման են մեկին

Առաջին հարցն է. ո՞ր ինտերպրետատորն է գործարկել այն ծրագիրը, որը տպել է traceback-ը։ Երկրորդը. ո՞ր ինտերպրետատորը պետք է օգտագործի իմ նախագիծը։ Տերմինալում դրանք նույնական են թվում, որովհետև երկուսին էլ պատասխանում են python3 մուտքագրելով, և նրանք ունեն տարբեր սեփականատերեր, տարբեր թարմացման ուղիներ և տարբեր ազդեցության շառավիղ։

Համակարգի գործիքը կապված է այն ինտերպրետատորի հետ, որով առաքվել է նրա դիստրիբուտիվը, ինչպես նաև այդ ինտերպրետատորի ABI-ի դեմ կառուցված կոմպիլացված մոդուլների հետ։ Նախագիծը կապված է այն միջավայրի հետ, որը դուք ստեղծում եք նրա համար։ Համակարգի լռելյայնը տեղափոխելը փոխում է առաջինը մեքենայի բոլոր գործիքների համար միաժամանակ, միջավայր ստեղծելը փոխում է երկրորդը մեկ պանակի համար։

Այդ գործողություններից միայն մեկն է հետադարձելի մեկ րոպեում։ Դա առաջինը չէ։

Ո՞ր բաղադրիչն է առաջացրել սխալը

Կարդացեք traceback-ի առաջին տողը և այն գործարկվող ֆայլը, որն առաջացրել է այն, նախքան որևէ այլ բան կարդալը։ Հրամանի տողի frontend-ը, արտոնյալ ծառայությունը և API-ի կապերը առանձին մասեր են, և դրանցից միայն ոմանք են ընդհանրապես Python։

command -v openvpn3
head -n 1 "$(command -v openvpn3)"
dpkg -S "$(command -v openvpn3)" 2>/dev/null
systemctl status openvpn3-service-client --no-pager

Սկրիպտի առաջին տողը նշում է ինտերպրետատորը, որը նա կօգտագործի, և հենց այդ ինտերպրետատորից է եկել traceback-ը։ Փաթեթի հարցումը ձեզ ասում է, թե ում է պատկանում ֆայլը, ինչը որոշում է, թե ով իրավունք ունի փոխել այն։ Ծառայության կարգավիճակը պատասխանում է բոլորովին այլ հարցի. արդյո՞ք աշխատում է այն արտոնյալ backend-ը, որը փաստացի սեսիաներ է հաստատում։

Մոդուլի ներմուծման սխալը, D-Bus ակտիվացման մերժումը և մերժված հավատարմագրությունը երեք տարբեր փուլեր են։ Ներմուծման սխալը տեղի է ունենում նախքան որևէ սեսիա գոյություն ունենալը, ուստի ոչ մի VPN կարգավորում այն չի շտկի, և աշխատող ծառայությունն էլ այն չի շտկի։ Հաղորդագրությունը այդ երեք փուլերից մեկին դասելն է իրական առաջին քայլը։

Ինչ կարող է շտկել նախագծի միջավայրը և ինչ ոչ

Նախագծի միջավայրը լուծում է նախագծի խնդիրը. ճշգրիտ գրադարանային տարբերակները, որոնք անհրաժեշտ են մեկ հավելվածի, մեկուսացված ամեն ինչից։ Դա իսկապես օգտակար է, և դա ճիշտ գործիքն է, երբ ձախողված ծրագիրը ձեր իսկ սկրիպտն է։

uv run --python 3.11 app.py
python3 -c 'import openvpn3; print(openvpn3.__file__)'

Երկրորդ հրահանգը ցույց է տալիս, թե կապերի որ պատճենն է տեսնում տվյալ ինտերպրետատորը, ինչը բացակայող փաթեթը ստվերված փաթեթից տարբերելու ամենաարագ ձևն է։ Գործարկեք այն ինտերպրետատորով, որն օգտագործում է ձախողված սկրիպտը, ոչ թե մեկ ուրիշով, որը պատահաբար աշխատում է։

Այն, ինչ նախագծի միջավայրը չի կարող անել, դիստրիբուտիվի կողմից փաթեթավորված frontend-ի վերանորոգումն է։ Այդ ծրագրի կախվածությունները կառուցվել են այն ինտերպրետատորի համար, որն ընտրել է փաթեթների կառավարիչը, և ձեր նախագծի միջավայրում այն գործարկելը կա՛մ ձախողվում է, կա՛մ ստեղծում է խառնուրդ, որը ոչ ոք չի աջակցում։ Ուղիներ ներարկելը դրա մեջ միջավայրի փոփոխականով նույն սխալն է լրացուցիչ քայլերով. դուք փոխել եք, թե ինչ է բեռնում գործիքը, առանց փոխելու, թե ինչի դեմ է այն փորձարկվել։ Այդ փոխանակումը նման է վերանորոգման ճիշտ այնքան ժամանակ, որքան պահանջվում է հաջորդ ներմուծմանը հանդիպելու համար։

Ինչու համակարգի ինտերպրետատորի վերահասցեավորումը թակարդ է

Լռելյայն ինտերպրետատորը փոխելը գրավիչ է, որովհետև թվում է, թե մեկ հրահանգով շտկում է traceback-ը։ Այն նաև կոտրում է այն ենթադրությունը, որի վրա կառուցվել է հոսթի յուրաքանչյուր փաթեթավորված Python գործիք, և խափանումները հայտնվում են ավելի ուշ և անկապ տեղերում։

Այլընտրանքի ընտրության մեխանիզմները նախագծվել են համարժեք իրականացումների միջև անցնելու համար, ոչ թե ավելի նոր լեզու տեղադրելու ավելի հին կոմպիլացված մոդուլների տակ։ Կոմպիլացված ընդլայնումները կառուցվում են կոնկրետ ABI-ի համար, ուստի երեկ ներմուծված մոդուլն այսօր կարող է չբեռնվել առանց որևէ փաթեթ հեռացնելու։

Մարդկանց գտած խորհրդում անվանական թակարդ էլ կա։ Առանց տարբերակի python հրահանգը մեկ համընդհանուր իմաստ չունի դիստրիբուտիվների և միջավայրերի միջև, և այն որոշակի հիմնական տարբերակի ֆիքսված հոմանիշ համարելը տալիս է ուղղումներ, որոնք աշխատում են միայն այն մեքենայում, որտեղ գրվել են։ Կարդացեք ձեր առջևի համակարգի քաղաքականությունը, ոչ թե բլոգի գրառմանը։

Առանձին ընդունման թեստեր

Վերջում պետք է լինեն երկու թեստ, և մեկի անցնելը ոչինչ չի ասում մյուսի մասին։ Առաջինն այն է, որ աջակցվող հաճախորդի հրահանգը աշխատում է այն ինտերպրետատորով, որի համար փաթեթավորվել է։ Երկրորդն այն է, որ արտոնյալ ծառայությունը սեսիա է հաստատում, և թունելը տեղափոխում է երթևեկություն։

openvpn3 sessions-list
openvpn3-service-client --help 2>/dev/null | head -n 3
ip -4 addr show tun0

Աշխատելիս պահեք մեքենա մտնելու անկախ ուղի, հատկապես եթե VPN-ը կրում է ձեր միակ վարչական հասանելիությունը։ Համակարգի ինտերպրետատորի փոփոխությունը հենց այնպիսի խմբագրում է, որը կարող է վերացնել այդ հասանելիությունը ճանապարհի կեսին։

Եթե խափանումը համակարգի գործիքի համար բացակայող մոդուլ է, ուղղումը փաթեթային գործողություն է աջակցվող աշխատատարածքով։ Եթե խափանումը ձեր սեփական նախագծում տարբերակների բախում է, ուղղումը միջավայր է։ Այդ երկուսի միջև ընտրությունը ողջ որոշումն է, և այն որոշվում է նրանով, թե որ ծրագիրն է տպել traceback-ը։

Առնչվող հոդվածներ