EQVPS

ایپ کو چلتا رکھنے کے لیے systemd سروس کیسے بنائیں

کسی بھی اسکرپٹ یا ایپ کو ایک منظم سروس میں بدلیں جو بوٹ پر شروع ہو، کریش ہونے پر دوبارہ چلے، اور journalctl میں لاگ رکھے۔ ایک یونٹ فائل لکھیں، اسے فعال کریں، اور اس کی حالت دیکھیں — لینکس پر کسی چیز کو 24/7 چلانے کا معیاری طریقہ۔

ایپ کو & یا nohup سے چلانا ٹھیک ہے — یہاں تک کہ سرور ری بوٹ ہو، پروسیس کریش کرے، یا آپ اس کے لاگ ڈھونڈنا چاہیں — تب یہ بکھر جاتا ہے۔ systemd معیاری جواب ہے: یہ آپ کی ایپ بوٹ پر شروع کرتا ہے، مرنے پر دوبارہ چلاتا ہے، اور اس کے لاگ پکڑتا ہے۔ کسی اسکرپٹ یا بائنری کو منظم سروس میں بدلنا ایک چھوٹی فائل ہے۔

1. ایک یونٹ فائل لکھیں

/etc/systemd/system/myapp.service بنائیں:

[Unit]
Description=My application
After=network.target

[Service]
User=myapp
WorkingDirectory=/opt/myapp
ExecStart=/usr/bin/python3 /opt/myapp/run.py
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target

ExecStart، WorkingDirectory اور User کو اپنی ایپ کے مطابق ایڈجسٹ کریں۔ Restart=always ہی وہ چیز ہے جو اسے زندہ رکھتی ہے۔

2. ایک مخصوص صارف بنائیں (تجویز کردہ)

sudo useradd --system --no-create-home --shell /usr/sbin/nologin myapp
sudo chown -R myapp:myapp /opt/myapp

غیر روٹ صارف کے طور پر چلانا، اگر ایپ کبھی سمجھوتہ ہو جائے تو نقصان کو محدود کرتا ہے۔

3. اسے فعال کریں اور شروع کریں

sudo systemctl daemon-reload
sudo systemctl enable --now myapp

enable اسے بوٹ پر شروع کراتا ہے؛ --now اسے فوراً شروع کرتا ہے۔

4. حالت اور لاگ دیکھیں

sudo systemctl status myapp
journalctl -u myapp -f       # براہِ راست لاگ کی پیروی کریں

روزمرہ کے کمانڈز

sudo systemctl restart myapp   # تبدیلی کے بعد دوبارہ چلائیں
sudo systemctl stop myapp      # اسے روکیں
sudo systemctl disable myapp   # بوٹ پر شروع ہونا بند کریں

ایماندارانہ انتباہ

اگلے قدم

systemd سروس وہی ہے جس سے آپ کسی بھی چیز کو 24/7 چلتا رکھتے ہیں — مثلاً چوبیس گھنٹے چلنے والا ایک AI ایجنٹ یا سیلف ہوسٹڈ RustDesk سرور کے پیچھے کا ریلے۔ اگر آپ کی ایپ اس کے بجائے کنٹینرائزڈ ہے، تو Docker کا --restart unless-stopped وہی کردار ادا کرتا ہے — دیکھیں Docker کیسے انسٹال کریں۔

عمومی سوالات

ایپ کو صرف پس منظر میں چلانے کے بجائے systemd کیوں؟

پس منظر کا ایک پروسیس (& یا nohup کے ساتھ) ری بوٹ پر مر جاتا ہے، کریش ہونے پر واپس نہیں آتا، اور اپنے لاگ بکھیر دیتا ہے۔ ایک systemd سروس بوٹ پر خودکار شروع ہوتی ہے، ناکامی پر دوبارہ چلتی ہے، اور اپنا آؤٹ پٹ journalctl کو بھیجتی ہے۔ لینکس پر کسی دیرپا چیز کو چلانے کا یہ معیاری، قابلِ اعتماد طریقہ ہے۔

یونٹ فائلیں کہاں رکھی جاتی ہیں؟

آپ کی اپنی سروسز /etc/systemd/system/ میں جاتی ہیں، ہر سروس کے لیے ایک فائل، something.service جیسے نام سے۔ بنانے یا ترمیم کے بعد 'systemctl daemon-reload' چلائیں تاکہ systemd تبدیلی لے، پھر اسے فعال کریں اور شروع کریں۔

'Restart=always' کیا کرتا ہے، اور کیا اس کے نقصانات ہیں؟

یہ systemd کو کہتا ہے کہ سروس جب بھی کسی بھی وجہ سے ختم ہو، اسے دوبارہ چلائے — کسی چیز کو چلتا رکھنے کی کنجی۔ واحد پھندا کریش لوپ ہے: اگر ایپ شروع ہوتے ہی فوراً ناکام ہو، تو systemd اسے بار بار دوبارہ چلاتا رہتا ہے۔ کوششوں میں وقفہ دینے کے لیے 'RestartSec=5' شامل کریں، اور بنیادی خرابی درست کرنے کے لیے لاگ دیکھیں۔

میں سروس کے لاگ کیسے دیکھوں؟

براہِ راست آؤٹ پٹ کی پیروی کے لیے 'journalctl -u yourservice -f'، یا تاریخ پڑھنے کے لیے -f کے بغیر استعمال کریں۔ systemd stdout اور stderr خودکار پکڑتا ہے، لہٰذا آپ کو خود لاگ فائلیں جوڑنے کی ضرورت نہیں۔

کیا سروس کو root کے طور پر چلنا چاہیے؟

بہتر ہے نہیں۔ ایک مخصوص غیر روٹ صارف بنائیں اور یونٹ میں 'User=' مقرر کریں، تاکہ ایپ کا سمجھوتہ پوری مشین نہ سونپ دے۔ root کے طور پر صرف تب چلائیں جب سروس کو واقعی اس کی ضرورت ہو۔

تبصرے

ابھی کوئی تبصرہ نہیں۔ پہلے بنیں۔

ایک تبصرہ چھوڑیں

تبصرے ظاہر ہونے سے پہلے moderate کیے جاتے ہیں۔