systemd માં OpenVPN ની અવ્યવસ્થિત પસંદગી: ExecStart કેમ નિષ્ફળ જાય છે
systemd એ shell નથી, તેથી ExecStart ની અંદર શફલ કરેલી નકલ મરી જાય છે. પસંદગીને ExecStartPre માં ખસેડો, અથવા OpenVPN ને પોતે સર્વર પસંદ કરવા દો.
એક દેશ માટે ચાલીસ .ovpn ફાઇલો પ્રદાતા પાસેથી આવે છે, અને યોજના સ્પષ્ટ લાગે છે: એક અવ્યવસ્થિત ફાઇલને તેની જગ્યાએ કૉપી કરો, પછી ટનલ શરૂ કરો. ExecStart ની અંદર પાઇપલાઇન તરીકે લખીએ તો એ યોજના બૂટ વખતે એવા સ્ટેટસ કોડ સાથે મરી જાય છે જે કંઈ સમજાવતો નથી. યુનિટ ફાઇલ સ્ક્રિપ્ટ નથી, અને સુધારો એ છે કે કાં તો સ્પષ્ટપણે shell લાવવો, કાં તો ફાઇલો પસંદ કરવાનું સંપૂર્ણપણે બંધ કરવું.
લક્ષણ: એવું યુનિટ જે શરૂ થાય છે અને તરત જ મરી જાય છે
સ્ટેટસ બતાવે છે કે સેવા સેકન્ડના એક અંશમાં નિષ્ફળ ગઈ, અને જર્નલની લાઇન એવા આદેશનું નામ આપે છે જે કોઈ shell ને કદી મળ્યો ન હોત. ટનલ વિશે કંઈ દેખાતું નથી, કારણ કે ટનલ કદી શરૂ જ થઈ નહોતી.
જર્નલમાંથી ચોક્કસ કમાન્ડ લાઇન વાંચવી એ આની પુષ્ટિ કરવાની સૌથી ઝડપી રીત છે. systemd જે ચલાવ્યું તેને પુનરાવર્તિત કરે છે, અને સ્ટ્રિંગ પાઇપલાઇનના અક્ષરોને ઓપરેટર તરીકે નહીં, પણ શાબ્દિક આર્ગ્યુમેન્ટ તરીકે દેખાડશે.
ExecStart પાઇપલાઇન કેમ ચલાવી શકતું નથી
systemd પોતે કમાન્ડ લાઇનને વિભાજિત કરે છે, પોતાનું કોટિંગ અને ચલ-અવેજી લાગુ કરે છે, અને પછી પરિણામ સીધું ચલાવે છે. પાઇપ, રીડાયરેક્શન, shell નું ગ્લોબ વિસ્તરણ અને કમાન્ડ અવેજી સાદું રીતે એ વ્યાકરણનો ભાગ નથી. આ ડિઝાઇનની પસંદગી છે, ચૂક નહીં: યુનિટ શું ચલાવવું તે અંગે ઘોષણાત્મક છે, અને 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
ત્રણ વિગતો નક્કી કરે છે કે આ વાસ્તવિક મશીન સાથેના સંપર્કમાં ટકી રહેશે કે નહીં. નામકરણ પહેલો જાળ છે: systemd યુનિટનું પાર્સિંગ કરતી વખતે જ, bash ચાલે તે પહેલાં ઘણું વહેલું, %i ની અવેજી કરે છે, તેથી સ્પેસિફાયર એક જ અવતરણ ચિહ્નોની બહાર રહેવું જોઈએ. xargs -r cp ને કોઈ આર્ગ્યુમેન્ટ વિના ચાલતું અટકાવે છે જ્યારે ગ્લોબ કંઈ સાથે મેળ ખાતું નથી. અને નિષ્ફળ તૈયારીનું પગલું યુનિટને થોભાવે છે, અને એ જ સાચું પરિણામ છે: ગઈકાલના રૂપરેખાંકન સાથે શરૂ કરવું ન શરૂ કરવા કરતાં ખરાબ છે. જે અવ્યવસ્થિત પસંદગી હંમેશાં એક જ ફાઇલ લે છે તે સામાન્ય રીતે ખરાબ નસીબ નથી. તપાસો કે કૉપી કરેલી ફાઇલ પેકેજ અપડેટ દ્વારા ફરી લખાય છે કે નહીં, અથવા ગ્લોબ ફક્ત એક જ જૂની એન્ટ્રી સાથે મેળ ખાય છે કે નહીં.
અથવા OpenVPN ને એન્ડપોઇન્ટ પસંદ કરવા દો
OpenVPN પહેલેથી જ એક પ્રોફાઇલમાં ઘણા એન્ડપોઇન્ટ રાખી શકે છે અને તેમાંથી અવ્યવસ્થિત રીતે પસંદ કરી શકે છે, જે બૂટના માર્ગમાંથી shell, નકલ અને લખવાનો અધિકાર સંપૂર્ણપણે દૂર કરે છે.
client
remote-random
<connection>
remote au1.example.net 1194 udp
</connection>
<connection>
remote au2.example.net 1194 udp
</connection>
આ સ્વરૂપ સર્વરની પસંદગીને પ્રદાતાએ લખેલી ફાઇલની અંદર રાખે છે, તેથી ફાઇલોનું નામ બદલતું રોટેશન યુનિટને તોડતું નથી. તે ઉમેદવારોની યાદીને ઓડિટ કરી શકાય તેવી પણ બનાવે છે, જે ડિરેક્ટરી પરનું ગ્લોબ કદી હોતું નથી. જ્યારે પ્રોફાઇલ એન્ડપોઇન્ટ કરતાં વધુ બાબતોમાં ભિન્ન હોય ત્યારે શફલ હજી પણ પોતાનું સ્થાન ધરાવે છે: અલગ પ્રમાણપત્રો, અલગ રૂટિંગ નિર્દેશો, અલગ સાઇફર નીતિ. એ સ્થિતિમાં પસંદગી આખા રૂપરેખાંકનો વચ્ચેની હોય છે અને shell નું પગલું તેને વ્યક્ત કરવાની પ્રામાણિક રીત છે.
ઇન્સ્ટન્સ અને તેણે વાપરેલી ફાઇલ ફરી વાંચો
તેની સામગ્રી ડિબગ કરતા પહેલાં ખાતરી કરો કે કયું યુનિટ ખરેખર ચાલે છે. પેકેજ થયેલી મેટા સેવા અને ટેમ્પલેટ ઇન્ફ્રાસ્ટ્રક્ચર છે; તમારી ફાઇલોને અનુરૂપ યુનિટ એ જ ઇન્સ્ટન્સ છે જે તેમનાં નામ પરથી ઓળખાય છે.
systemctl list-units 'openvpn*'
systemctl cat [email protected]
journalctl -u openvpn@au -n 30 --no-pager
જે ઇન્સ્ટન્સ કોઈને યાદ નથી કે તેણે સક્રિય કર્યું હતું, તે સામાન્ય રીતે પેકેજ ડિરેક્ટરીમાં રખડતી રૂપરેખાંકન ફાઇલ સુધી લઈ જાય છે. ટેમ્પલેટને બદલે એ નામવાળું ઇન્સ્ટન્સ બંધ કરો, નહીં તો આગલું પેકેજ અપગ્રેડ તેને પાછું લાવશે. ફેરફાર પછી યુનિટ શરૂ કરો અને જર્નલ જે કમાન્ડ લાઇન જણાવે છે તે વાંચો, પછી તેણે ખરેખર ખોલેલો રૂપરેખાંકન માર્ગ નક્કી કરો. એ એક ચકાસણી કામ કરતી અવ્યવસ્થિત પસંદગીને ગયા મહિનાની ફાઇલ ચૂપચાપ ફરી વાપરતી સેવાથી અલગ પાડે છે.