அதே கட்டளை ஷெல்லில் இருந்து இணைக்கிறது, cron கீழ் இறக்கிறது, எனவே சுரங்கப்பாதை அல்லது சான்றிதழ்தான் குற்றவாளி என்று முடிவு எடுப்பது இயல்பு. அதை நம்புவதற்கு முன் இரு இயக்கங்களுக்கும் பொதுவானது என்ன என்று பாருங்கள்: பைனரி, உள்ளமைவு மற்றும் சான்றுகள் ஒரே மாதிரியானவை, மாறியது செயல்முறையின் சூழல் மட்டுமே. நிரலே கிடைக்காதபோது, எவ்வளவு TLS பிழைத்திருத்தமும் உதவாது. திருத்தம் பொதுவாக ஒரு பாதையில், ஒரு பணி அடைவில், சில சூழல் மாறிகளில் இருக்கும், VPN இல் அல்ல.

வேலை செய்யும் ஷெல்லில் command -v openvpn பதிலை அச்சிடுகிறது, அது பெரும்பாலும் /usr/sbin/openvpn, அதாவது cron தன் தேடல் பாதையில் வைக்காத அடைவு.

சுரங்கப்பாதை ஒருபோதும் தொடங்கவில்லை, எனவே சுரங்கப்பாதை பிரச்சினை அல்ல

cron தொடங்கும் பணிகள் குறைந்தபட்ச சூழலை வாரிசாகப் பெறுகின்றன, பொதுவாக PATH=/usr/bin:/bin, மேலும் கட்டுப்பாட்டு முனையம் பெறுவதில்லை. /usr/sbin அல்லது /usr/local/sbin இல் நிறுவப்பட்ட எதுவும் அந்த பட்டியலில் இல்லை, மேலும் பதிவு வரி TLS பிழைக்கு பதிலாக openvpn: not found என்று படிக்கிறது. Python இன் subprocess வேறு விதமாக தோல்வியடைகிறது: இது மொழிபெயர்ப்பான் செயல்முறையின் சூழலை வாரிசாகப் பெறுகிறது, அது cron ஐ விட வளமாக இருக்கலாம் ஆனால் டில்டாவை விரிவாக்க ஷெல் இன்னும் இல்லை. இரு தோல்விகளும் ஒரு பாக்கெட் கூட புரவலனை விட்டு வெளியேறும் முன் நிகழ்கின்றன.

அவற்றை வேறுபடுத்தும் விரைவான வழி கடைசி பிழைக்கு பதிலாக முதல் பிழையைப் படிப்பதாகும். இல்லாத பைனரி ஷெல் அல்லது Python விதிவிலக்கை உருவாக்குகிறது, மோசமான உள்ளமைவு OpenVPN பயன்பாட்டுச் செய்தியை உருவாக்குகிறது, உண்மையான கைக்குலுக்கல் தோல்வி நேர முத்திரைகளையும் சகச் சுட்டிகளையும் உருவாக்குகிறது. மூன்றாவது மட்டுமே சுரங்கப்பாதை பிரச்சினை.

முழுமையான பாதைகளும் வாதப் பட்டியல்களும் ஷெல் சரங்களை வெல்கின்றன

தீர்க்கப்பட்ட பாதையை வெளிப்படையாகக் கொடுத்து ஷெல்லை முழுவதுமாகத் தவிர்க்கவும். subprocess.run(["/usr/sbin/openvpn", "--config", config, "--verb", "4"], capture_output=True, text=True, timeout=90) கோப்புப் பெயரை விளக்க ஷெல்லைக் கேட்காமல் திரும்பும் குறியீடு, stdout மற்றும் stderr ஐ தருகிறது. உள்ளமைவின் பாதையை os.environ["HOME"] அல்லது pathlib.Path.home() இல் இருந்து கட்டமைக்கவும், டில்டா ஒருபோதும் விரிவாக்கப்பட வேண்டியதில்லை. உண்மையில் ஷெல் தொடரியல் தேவைப்படும்போது shlex.split ஐப் பயன்படுத்துங்கள், ஏனெனில் .split() உடன் சரத்தைப் பிரிப்பது இடைவெளி உள்ள எந்தப் பாதையிலும் உடையும். stderr ஐயும் படியுங்கள், ஏனெனில் OpenVPN அதன் பெரும்பாலான ஆரம்பத் தோல்விகளை அங்கே எழுதுகிறது.

அதே விதி cron க்கும் பொருந்தும்: பணி வரி உள்நுழைவு ஷெல் அல்ல, எனவே எதுவும் உங்கள் சுயவிவரத்தை ஏற்றாது, எதுவும் உங்கள் மாற்றுப் பெயர்களை வரையறுக்காது.

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 பிழைகளாகத் தோன்றி கைமுறையாக மறுதொடக்கம் செய்யும்போது மறைகிறது.

தொடர்புடைய கட்டுரைகள்