کام کرنے والی کمانڈ لائن 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 زندگی کے دور کا حصہ ہے یا ہاتھ سے کی جانے والی تشخیص رہنا چاہیے، کیونکہ دوسرا پس منظر سرنگ عمل مسابقتی مالک پیدا کرتا ہے۔

طلب پر درست آؤٹ پٹ پرنٹ کرنے والی یونٹ اچھا پہلا سنگ میل ہے۔ یہ ابھی سرنگ نہیں، اور سرنگ ہونے کا دعویٰ نہیں کرنا چاہیے۔

متعلقہ مضامین