OpenVPN shell එකේ වැඩ කරයි, නමුත් cron යටතේ අසාර්ථක වේ: හේතුව PATH
shell එකකින් සම්බන්ධ වන විධානයක් ටනලය ආරම්භ වීමට පෙර cron හෝ subprocess යටතේ අසාර්ථක විය හැක. මාර්ගය, කාර්ය ඩිරෙක්ටරිය සහ ටර්මිනලය නිවැරදි කරන්න.
එකම විධානය shell එකකින් සම්බන්ධ වී cron යටතේ මිය යයි, එබැවින් ස්වාභාවික නිගමනය වන්නේ ටනලය හෝ සහතිකය වැරදි බවයි. එය විශ්වාස කිරීමට පෙර දෙක් ධාවනයට පොදු කුමක්දැයි බලන්න: බයිනරිය, වින්යාසය සහ අක්තපත්ර සමානය, වෙනස් වී ඇත්තේ ක්රියාවලියේ පරිසරය පමණි. වැඩසටහන සොයාගත නොහැකි විට, කොපමණ TLS නිරාකරණයක්වත් උදව් නොවේ. නිවැරදි කිරීම සාමාන්යයෙන් මාර්ගයක, කාර්ය ඩිරෙක්ටරියක සහ පරිසර විචල්ය කිහිපයක ඇත, VPN එකේ නොවේ.
වැඩ කරන shell එකේ command -v openvpn පිළිතුර මුද්රණය කරයි, එය බොහෝ විට /usr/sbin/openvpn වේ, එනම් cron තම සෙවුම් මාර්ගයට නොදමන ඩිරෙක්ටරියයි.
ටනලය කිසිදා ආරම්භ නොවීය, එබැවින් ටනලය ගැටලුව නොවේ
cron මගින් ආරම්භ කරන කාර්යයන් අවම පරිසරයක් උරුම කර ගනී, සාම්ප්රදායිකව PATH=/usr/bin:/bin, සහ පාලක ටර්මිනලයක් නොලැබේ. /usr/sbin හෝ /usr/local/sbin තුළ ස්ථාපනය කර ඇති සියල්ල එම ලැයිස්තුවෙන් සරලව නොපවතී, සහ ලොග් පේළිය TLS දෝෂයක් වෙනුවට openvpn: not found කියවයි. Python හි subprocess වෙනස් ලෙස අසාර්ථක වේ: එය අන්තර්ප්රිටර් ක්රියාවලියේ පරිසරය උරුම කර ගනී, එය cron ට වඩා පොහොසත් විය හැකි නමුත් ටිල්ඩා විහිදුවීමට shell එකක් තවම නැත. දෙක් අසාර්ථකත්වයම එක් පැකට්ටුවක්වත් සත්කාරකය හැර යාමට පෙර සිදු වේ.
ඒවා වෙන් කර හඳුනා ගැනීමේ ඉක්මන් ක්රමය අවසාන දෝෂය වෙනුවට පළමු දෝෂය කියවීමයි. නොමැති බයිනරිය shell හෝ Python ව්යතිරේකයක් ඇති කරයි, නරක වින්යාසය OpenVPN භාවිත පණිවිඩයක් ඇති කරයි, සහ සැබෑ හස්ත සම්පර්ක අසාර්ථකත්වය කාල මුද්රා සහ සමක ලිපින ඇති කරයි. තුන්වැන්න පමණක් ටනල ගැටලුවකි.
නිරපේක්ෂ මාර්ග සහ තර්ක ලැයිස්තු shell තන්තු පරදවයි
විසඳන ලද මාර්ගය පැහැදිලිව ලබා දී shell එක සම්පූර්ණයෙන් මඟ හරින්න. subprocess.run(["/usr/sbin/openvpn", "--config", config, "--verb", "4"], capture_output=True, text=True, timeout=90) ගොනු නාමය අර්ථ නිරූපණය කරන ලෙස shell එකකින් නොඉල්ලා ආපසු කේතය, stdout සහ stderr ලබා දෙයි. වින්යාස මාර්ගය os.environ["HOME"] හෝ pathlib.Path.home() වෙතින් ගොඩනගන්න, එවිට ටිල්ඩා කිසිදා විහිදුවීමට අවශ්ය නොවේ. සැබවින්ම shell වාක්ය රීතිය අවශ්ය විට, shlex.split භාවිත කරන්න, මන්ද .split() සමඟ තන්තුව බෙදීම හිස් ඉඩක් ඇති ඕනෑම මාර්ගයක කැඩී යයි. stderr ද කියවන්න, මන්ද OpenVPN තම බොහෝ මුල් අසාර්ථකත්ව එහි ලියයි.
එකම රීතිය cron සඳහාද අදාළ වේ: කාර්ය පේළිය පිවිසුම් shell එකක් නොවේ, එබැවින් කිසිවක් ඔබේ පැතිකඩ පූරණය නොකරයි, කිසිවක් ඔබේ අන්වර්ථ නොනිර්වචනය කරයි.
crontab සැබවින්ම උරුම කර ගන්නේ කුමක්ද
crontab සටහනට crontab ප්රකාශ කරන පරිසරය සහ උරුම වූ පෙරනිමි අගය කිහිපයක් ලැබේ, එබැවින් මාර්ගය සම්පූර්ණයෙන් ලියන්න හෝ එය කරන ස්ක්රිප්ටයක ඇමතුම ඔතන්න. ගොනුවේ මුදුනේ PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin වැනි පේළියක් සාමාන්ය ස්ථාපන ස්ථාන ආවරණය කරයි, සහ >> cron.log 2>&1 සමඟ නැවත යොමු කිරීම ඊළඟ අසාර්ථකත්වය කියවිය හැකි කරයි. මුරපද වාක්යයකින් ආරක්ෂිත පැතිකඩකට cron යටතේ තම රහස ඉල්ලීමට මාර්ගයක් නැත, මන්ද ඇසීමට ටර්මිනලයක් නොමැත. එවැනි සම්බන්ධතාවයක් අක්තපත්ර ගොනුවක් කියවිය හැකි systemd ඒකකයකට අයත් වේ, තමන් අන්තර්ක්රියාකාරී ලෙස පෙනෙන කාර්යයකට නොවේ.
සාපේක්ෂ මාර්ග දෙවන උගුලයි. පරීක්ෂණ ධාවනය බොහෝ විට පැතිකඩ ඇති ෆෝල්ඩරයෙන් සිදු වේ, සහ cron කාර්යය සම්පූර්ණයෙන්ම වෙනත් තැනක ආරම්භ වේ, එබැවින් --config office.ovpn එහි නොමැති ගොනුවකට විසඳෙන අතර පණිවිඩය නොමැති ටනලයක් වෙනුවට නොමැති ගොනුවක් ලෙස කියවේ.
පරිසරය ඉවත් කර එය ඔප්පු කරන්න
අවම පරිසරය සෘජුවම ප්රතිනිෂ්පාදනය කරන්න: env -i PATH=/usr/bin:/bin /usr/sbin/openvpn --config office.ovpn --verb 4. එම ධාවනයෙන් මාර්ගය හෝ ටර්මිනලය ගැන පැමිණිල්ලක් ආවොත් ගැටලුව VPN ට ඉහළින් ඇත. එය සම්බන්ධ වන්නේ නම්, ඉතිරි සැකකරුවන් වන්නේ එය ධාවනය වන ගිණුම, එය ආරම්භ වන ඩිරෙක්ටරිය සහ එය ඉදිරිපත් කරන අක්තපත්රයයි. ප්රතිඵල දෙකෙන් ඕනෑම එකක් සහතික පරීක්ෂාවේ තවත් වටයකට වඩා හොඳය.
පසුව ආවරණය ස්වයං වාර්තාකරණ ලෙස සකසන්න. එය ළඟා වූ සෑම අදියරකටම වෙනස් තත්ත්වයකින් ඉවත් වන්න, ධාරා දෙකම කාල මුද්රාවක් සමඟ ලොග් කරන්න, ඊළඟ අසාර්ථකත්වය එය මාර්ග විසඳීමේදී, සත්යාපනයේදී, නැතහොත් ටනලය දැනටමත් ඉහළ තිබියදී මිය ගියේදැයි ඔබට කියයි.
ඒකකයකට නිවැරදි අනුපිළිවෙලද අවශ්යය: Wants=network-online.target සමඟ After=network-online.target ලිපිනයක් හෝ පෙරනිමි මාර්ගයක් පැවතීමට පෙර සේවාදායකය ආරම්භ වීම වළක්වයි, එය එසේ නොවුණහොත් සහතික හෝ TLS දෝෂ ලෙස දිස්වන අතර අතින් නැවත ආරම්භ කිරීමේදී අතුරුදහන් වේ.