systemd හි OpenVPN අහඹු තේරීම: ExecStart ඇයි අසාර්ථක වන්නේ
systemd යනු shell එකක් නොවේ, එබැවින් ExecStart තුළ මිශර කළ පිටපත මිය යයි. තේරීම ExecStartPre වෙත ගෙනයන්න, නැතහොත් OpenVPN ටම සේවාදායකය තෝරා ගැනීමට ඉඩ දෙන්න.
එක් රටක් සඳහා හතළිස් .ovpn ගොනු සැපයුම්කරුවෙකුගෙන් පැමිණේ, සහ සැලැස්ම පැහැදිලි බව පෙනේ: අහඹු එකක් එහි තැනට පිටපත් කරන්න, පසුව උමග අරඹන්න. ExecStart තුළ පයිප්ලයින් එකක් ලෙස ලියන විට, එම සැලැස්ම පැටවීමේදී කිසිවක් පැහැදිලි නොකරන තත්ත්ව කේතයක් සමඟ මිය යයි. යුනිට් ගොනුව ස්ක්රිප්ට් එකක් නොවේ, සහ නිවැරදි කිරීම යනු shell එකක් පැහැදිලිව ගෙන ඒම හෝ ගොනු තේරීම සම්පූර්ණයෙන්ම නතර කිරීමයි.
රෝග ලක්ෂණය: ආරම්භ වී වහාම මිය යන යුනිට් එකක්
තත්ත්වය පෙන්වන්නේ සේවාව තත්පරයක කොටසකින් අසාර්ථක වූ බවයි, සහ ජර්නල් පේළිය කිසිදු shell එකකට කිසිදා නොලැබෙන විධානයක් නම් කරයි. උමග ගැන කිසිවක් නොපෙනේ, උමග කිසිදා ආරම්භ නොවූ බැවිනි.
ජර්නලයෙන් නිශ්චිත විධාන පේළිය කියවීම මෙය තහවුරු කිරීමට වේගවත්ම ක්රමයයි. systemd එය ක්රියාත්මක කළ දෙය නැවත කියයි, සහ පයිප්ලයින් අක්ෂර ක්රියාකාරක ලෙස නොව වචනාර්ථ තර්ක ලෙස තන්තුව පෙන්වනු ඇත.
ExecStart ට පයිප්ලයින් එකක් ධාවනය කළ නොහැක්කේ ඇයි
systemd තමාම විධාන පේළිය බෙදා, තමන්ගේම උද්ධෘත සහ විචල්ය ආදේශනය යොදා, පසුව ප්රතිඵලය සෘජුවම ක්රියාත්මක කරයි. පයිප්, යළි-ආයෝජනය, shell එකක් විසින් සිදු කරන glob ව්යාප්තිය සහ විධාන ආදේශනය මෙම ව්යාකරණයේ කොටසක් නොවේ. මෙය නොසලකා හැරීමක් නොව නිර්මාණ තේරීමකි: යුනිට් එක ක්රියාත්මක කළ යුතු දේ ප්රකාශාත්මකව පවසයි, සහ shell තර්කනය යුනිට් එක විසින් අමතන ස්ක්රිප්ට් එකට අයත් වේ. නිවැරදි කිරීම් දෙකම එයින් පැන නඟී, සහ කිසිවක් යුනිට් එකට වැඩි අවසර ලබා දීම අවශ්ය නොවේ.
එය නොමඟ යවන පිටවීම් කේතය ද පැහැදිලි කරයි. පළමු තර්කය ද්විමය ලෙස සැලකේ, එබැවින් ඔබේ තර්කනයේ කිසිදු කොටසක් ධාවනය වීමට පෙර වැරදි ලෙස සකසන ලද පේළිය අසාර්ථක වේ.
තේරීම ExecStartPre තුළ කරන්න
සෘජු නිවැරදි කිරීම යනු shell එකක් පැහැදිලිව අමතන සූදානම් කිරීමේ පියවරක් වන අතර, තේරීම සහ ආරම්භය එකම යුනිට් එකේ තබා ගනී, එවිට එකක අසාර්ථකත්වයක් අනෙක තනිව ධාවනය වීමට ඉඩ නොදේ.
[Service]
Type=notify
ExecStartPre=/bin/bash -c "ls /etc/openvpn/profiles/au* | shuf -n 1 | xargs -r -I{} cp -f {} /etc/openvpn/%i.conf"
ExecStart=/usr/sbin/openvpn --config /etc/openvpn/%i.conf
සැබෑ යන්ත්රයක් සමඟ සම්බන්ධ වීමේදී මෙය ඔරොත්තු දෙන්නේද යන්න විස්තර තුනක් තීරණය කරයි. නම් කිරීම පළමු උගුලයි: යුනිට් එක විග්රහ කරන විටම, bash ධාවනය වීමට බොහෝ කලකට පෙර systemd %i ආදේශ කරයි, එබැවින් විශේෂකය තනි උද්ධෘත ලකුණුවලින් පිටත තිබිය යුතුය. glob කිසිවකට නොගැළපෙන විට cp තර්කයකින් තොරව ධාවනය වීම xargs -r වළක්වයි. අසාර්ථක සූදානම් කිරීමේ පියවරක් යුනිට් එක නවත්වයි, සහ එය නිවැරදි ප්රතිඵලයයි: ඊයේ ආකෘතිකරණය සමඟ ආරම්භ කිරීම නොආරම්භ කිරීමට වඩා නරකය. සෑම විටම එකම ගොනුව ගන්නා අහඹු තේරීමක් සාමාන්යයෙන් අවාසනාවක් නොවේ. පිටපත් කළ ගොනුව පැකේජ යාවත්කාලීනයකින් උඩින් ලියැවෙන්නේද, නැතහොත් glob ගැළපෙන්නේ එක් පැරණි සටහනකට පමණක්දැයි පරීක්ෂා කරන්න.
නැතහොත් OpenVPN ට අන්ත ලක්ෂ්යය තෝරා ගැනීමට ඉඩ දෙන්න
OpenVPN දැනටමත් එක් පැතිකඩක් තුළ අන්ත ලක්ෂ්ය කිහිපයක් තබා ගෙන ඒවා අතරින් අහඹු ලෙස තෝරා ගත හැකිය, එය shell එක, පිටපත සහ ලිවීමේ ප්රවේශය පැටවීමේ මාර්ගයෙන් සම්පූර්ණයෙන්ම ඉවත් කරයි.
client
remote-random
<connection>
remote au1.example.net 1194 udp
</connection>
<connection>
remote au2.example.net 1194 udp
</connection>
මෙම ආකාරය සේවාදායක තේරීම සැපයුම්කරු ලියූ ගොනුව තුළම තබා ගනී, එබැවින් ගොනු නැවත නම් කරන භ්රමණයක් යුනිට් එක බිඳ දමන්නේ නැත. එය අපේක්ෂක ලැයිස්තුව විගණනය කළ හැකි එකක් ද කරයි, එය නාමාවලියක් මත glob එකකට කිසිදා නොමැත. පැතිකඩ අන්ත ලක්ෂ්යයකට වඩා වෙනස් වන විට මිශ්ර කිරීම තවමත් ස්ථානයක් ලබා ගනී: වෙනස් සහතික, වෙනස් මාර්ගගත කිරීමේ උපදෙස්, වෙනස් සයිෆර් ප්රතිපත්තිය. එවැනි අවස්ථාවක තේරීම සම්පූර්ණ ආකෘතිකරණ අතර වන අතර shell පියවර එය ප්රකාශ කිරීමේ අවංක ක්රමයයි.
භාවිත කළ අවස්ථාව සහ ගොනුව නැවත කියවන්න
එහි අන්තර්ගතය දෝෂ නිරාකරණය කිරීමට පෙර කුමන යුනිට් එක සැබවින්ම ධාවනය වන්නේදැයි තහවුරු කරන්න. පැකේජ කළ මෙටා සේවාව සහ අච්චුව යටිතල පහසුකම් වේ; ඔබේ ගොනුවලට අනුරූප වන යුනිට් ඒවායේ නමින් හැඳින්වෙන අවස්ථා වේ.
systemctl list-units 'openvpn*'
systemctl cat [email protected]
journalctl -u openvpn@au -n 30 --no-pager
යමෙකු සක්රීය කළ බව මතක නැති අවස්ථාවක් සාමාන්යයෙන් පැකේජ නාමාවලියේ අතරමං වූ ආකෘතිකරණ ගොනුවකට යොමු කරයි. අච්චුව වෙනුවට එම නමැති අවස්ථාව ක්රියා විරහිත කරන්න, එසේ නොමැති නම් ඊළඟ පැකේජ උත්ශ්රේණිය එය නැවත ගෙන එනු ඇත. වෙනසෙන් පසු යුනිට් එක අරඹා ජර්නලය වාර්තා කරන විධාන පේළිය කියවන්න, පසුව එය සැබවින්ම විවෘත කළ ආකෘතිකරණ මාර්ගය තහවුරු කරන්න. එම එක් පරීක්ෂාවක් ක්රියාකාරී අහඹු තේරීමක් පසුගිය මාසයේ ගොනුවක් නිහඬව නැවත භාවිත කරන සේවාවකින් වෙන් කරයි.