పని చేసే కమాండ్ లైన్‌ను ExecStart లోకి కాపీ చేసి, మళ్లీ లోడ్ చేయండి; ఆర్గ్యుమెంట్లను ఫైల్ పేర్లుగా పరిగణించడంతో యూనిట్ విఫలమవుతుంది లేదా నిశ్శబ్దంగా నిష్క్రమిస్తుంది. systemd లో ఏదీ పాడవలేదు. ExecStart అనేది ఆర్గ్యుమెంట్ల జాబితా, shell కాదు, కాబట్టి పైపులు, రీడైరెక్షన్ మరియు షరతులు మీ టెర్మినల్‌ను విడిచిన క్షణంలోనే అర్థాన్ని కోల్పోతాయి. shell ఎక్కడ ఉండాలో నిర్ణయించి, ఆపై ఏమి అమలు కావాలో ఖచ్చితంగా చెప్పే యూనిట్ రాయండి.

ExecStart లోని పైప్‌లైన్ ఎందుకు ఏమీ చేయదు

టెర్మినల్‌లో కమాండ్ టైప్ చేసినప్పుడు shell దాన్ని మొదట విశ్లేషిస్తుంది. అది పైప్‌లైన్ నిర్మిస్తుంది, రీడైరెక్షన్ కోసం ఫైళ్లను తెరుస్తుంది మరియు ఏ ప్రోగ్రామ్ ప్రారంభమయ్యే ముందే వేరియబుల్స్ విస్తరిస్తుంది. systemd వాటిలో ఏదీ చేయదు: అది తన స్వంత నియమాల ప్రకారం ExecStart ను విభజించి, వచ్చిన ప్రోగ్రామ్‌ను ఆ ఆర్గ్యుమెంట్లతో నడుపుతుంది. అందువల్ల > అక్షరార్థ ఆర్గ్యుమెంట్‌గా వస్తుంది, మరియు | రెండు ప్రక్రియలను కలపడం బదులు ప్రోగ్రామ్‌కు అప్పగించబడుతుంది. యూనిట్ తప్పుగా ప్రవర్తించడం లేదు; వాక్యనిర్మాణం వేరే అర్థాన్ని సూచించింది.

ఇది నిర్లక్ష్యం కాదు, ఉద్దేశపూర్వకం, ఎందుకంటే ఆర్గ్యుమెంట్ల ముందుగా తెలిసే నిర్వహణే యూనిట్లను తనిఖీకి అనువుగా చేస్తుంది. shell ఉందని భావించేవారికి మాత్రమే ఇది ఆశ్చర్యం.

ఏమి నడుస్తుందో ఖచ్చితంగా చెప్పే యూనిట్ రాయండి

జర్నల్‌లో ఉద్దేశ్యం కనిపించే చిన్న యూనిట్‌తో ప్రారంభించండి, తద్వారా విశ్లేషణ సమస్యలు సొరంగ సమస్యల నుండి వేరుగా ఉంటాయి. ఇది బైనరీ వెర్షన్‌ను మాత్రమే నివేదిస్తుంది.

[Unit]
Description=Report the installed OpenVPN version

[Service]
Type=oneshot
ExecStart=/usr/sbin/openvpn --version
StandardOutput=journal
StandardError=journal

మార్గం ఒక ప్లేస్‌హోల్డర్, కాబట్టి నిజంగా ఇన్‌స్టాల్ అయిన బైనరీని పెట్టండి. Type=oneshot చివరి వరకు నడిచే కమాండ్‌కు సరిపోతుంది, జర్నల్ సెట్టింగ్‌లు దాని అవుట్‌పుట్‌ను టెర్మినల్ లేకుండా చదవగలిగే చోట ఉంచుతాయి. ఉద్దేశపూర్వకంగా ఇన్‌స్టాల్ విభాగం లేదు, కాబట్టి యూనిట్ బూట్‌లో ప్రారంభం కాకుండా చేతితో పిలువబడుతుంది. ప్రారంభించే ముందు ఫైల్‌ను ధృవీకరించండి, ఎందుకంటే డైరెక్టివ్ పేరులోని టైపో మార్గంలోని టైపో కంటే భిన్నంగా విఫలమవుతుంది.

systemd-analyze verify /etc/systemd/system/openvpn-version.service
systemctl start openvpn-version.service

shell లాజిక్‌ను స్క్రిప్ట్‌లో ఉంచండి

సహాయకుడికి నిజంగా షరతులతో కూడిన లాజిక్ అవసరమైతే, ఆ లాజిక్‌ను స్క్రిప్ట్‌లో పెట్టి స్పష్టంగా పిలవండి. స్క్రిప్ట్‌కు ఇంటర్‌ప్రెటర్ లైన్, అమలు అనుమతి మరియు సేవ నివేదించగల నిష్క్రమణ కోడ్‌లు అవసరం. /bin/sh -c ను కోట్ చేసిన కమాండ్‌తో అమలు చేయడం పనిచేస్తుంది, కానీ అది కోట్ నియమాలను యూనిట్ లోపల దాచి సమీక్షను కష్టతరం చేస్తుంది. పేరున్న స్క్రిప్ట్‌ను చేతితో పరీక్షించి తర్వాత యూనిట్ సవరించకుండా మార్చవచ్చు. ఇంటరాక్టివ్ వినియోగదారు shell ప్రొఫైల్‌పై ఆధారపడకండి, ఎందుకంటే సేవ తన స్వంత పరిసరంతో ప్రారంభమవుతుంది.

సాపేక్ష మార్గాలు ముఖ్యమైనప్పుడు WorkingDirectory సెట్ చేయండి, మరియు పరిసరాన్ని టెర్మినల్‌లో ఎక్స్‌పోర్ట్ చేయడం బదులు యూనిట్ మద్దతు ఇచ్చే డైరెక్టివ్‌ల ద్వారా పంపండి. రహస్యాలు రక్షిత ఫైళ్లలో లేదా ఆధారాలలో ఉంటాయి, జర్నల్ నమోదు చేయగల ఆర్గ్యుమెంట్ జాబితాలలో కాదు.

నిజంగా ఉన్న యూనిట్‌ను తనిఖీ చేయండి

drop-in ఫైళ్లు మీరు సవరించినట్లు గుర్తున్న ఫైల్‌ను తాకకుండా ప్రవర్తనను మారుస్తాయి. మేనేజర్ ఏమి లోడ్ చేసింది, చివరి రన్ ఏమి నివేదించింది చదవండి.

systemctl cat vpn-helper.service
journalctl -u vpn-helper.service -n 20 --no-pager

యూనిట్ డంప్ లోడ్ క్రమంలో drop-in ఫైళ్లను చేర్చుతుంది, ఊహించని ExecStart సాధారణంగా అక్కడి నుండే వస్తుంది. ఏ మార్పు తర్వాత అయినా మేనేజర్‌ను మళ్లీ లోడ్ చేసి, కొత్త నిర్వచనం systemctl cat ముద్రించేదే అని నిర్ధారించండి. జర్నల్ ఖచ్చితమైన కమాండ్ లైన్ మరియు నిష్క్రమణ స్థితిని చూపుతుంది, ఇది ఆర్గ్యుమెంట్ సమస్యను మాయమైన బైనరీ లేదా అనుమతి లోపం నుండి వేరు చేస్తుంది. తర్వాత సహాయకుడు ఉన్న VPN జీవిత చక్రానికి చెందుతుందా లేదా చేతితో చేసే నిర్ధారణగా ఉండాలా నిర్ణయించండి, ఎందుకంటే రెండవ నేపథ్య సొరంగ ప్రక్రియ పోటీ యజమానిని సృష్టిస్తుంది.

అభ్యర్థన మేరకు సరైన అవుట్‌పుట్ ముద్రించే యూనిట్ మంచి మొదటి మైలురాయి. ఇది ఇంకా సొరంగం కాదు, సొరంగం అని నటించకూడదు.

సంబంధిత వ్యాసాలు