EQVPS

ऐप को चलता रखने के लिए systemd सेवा कैसे बनाएँ

किसी भी स्क्रिप्ट या ऐप को एक प्रबंधित सेवा में बदलें जो बूट पर शुरू हो, क्रैश होने पर पुनः आरंभ हो, और journalctl में लॉग करे। एक यूनिट फ़ाइल लिखें, उसे सक्षम करें, और उसकी स्थिति जाँचें — Linux पर किसी चीज़ को 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

गैर-root उपयोगकर्ता के रूप में चलाना, यदि ऐप कभी समझौता हो जाए तो क्षति को सीमित करता है।

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 को भेजती है। Linux पर किसी दीर्घजीवी चीज़ को चलाने का यह मानक, भरोसेमंद तरीका है।

यूनिट फ़ाइलें कहाँ रखी जाती हैं?

आपकी अपनी सेवाएँ /etc/systemd/system/ में जाती हैं, प्रति सेवा एक फ़ाइल, something.service जैसे नाम से। बनाने या संपादित करने के बाद 'systemctl daemon-reload' चलाएँ ताकि systemd बदलाव उठा ले, फिर उसे सक्षम करें और शुरू करें।

'Restart=always' क्या करता है, और क्या इसके नुकसान हैं?

यह systemd को कहता है कि सेवा जब भी किसी भी कारण से बाहर निकले, उसे पुनः आरंभ करे — किसी चीज़ को चलता रखने की कुंजी। एकमात्र फंदा क्रैश लूप है: यदि ऐप शुरू होते ही तुरंत विफल हो, तो systemd उसे बार-बार पुनः आरंभ करता रहता है। प्रयासों में अंतर देने के लिए 'RestartSec=5' जोड़ें, और मूल त्रुटि ठीक करने के लिए लॉग देखें।

मैं सेवा के लॉग कैसे देखूँ?

सजीव आउटपुट का अनुसरण करने के लिए 'journalctl -u yourservice -f', या इतिहास पढ़ने के लिए -f के बिना उपयोग करें। systemd stdout और stderr स्वतः कैप्चर करता है, इसलिए आपको स्वयं लॉग फ़ाइलें जोड़ने की ज़रूरत नहीं।

क्या सेवा को root के रूप में चलना चाहिए?

बेहतर है नहीं। एक समर्पित गैर-root उपयोगकर्ता बनाएँ और यूनिट में 'User=' सेट करें, ताकि ऐप का समझौता पूरी मशीन न सौंप दे। root के रूप में केवल तभी चलाएँ जब सेवा को सचमुच इसकी आवश्यकता हो।

टिप्पणियाँ

अभी तक कोई टिप्पणी नहीं। पहले बनें।

एक टिप्पणी छोड़ें

टिप्पणियाँ दिखने से पहले मॉडरेट की जाती हैं।