एक डेमॉन के रूप में शेल स्क्रिप्ट को चलाने के लिए "उचित" तरीका


20

मैं एक शेल स्क्रिप्ट लिख रहा हूं जिसे मैं डेमोंटूलस या डेमनीज जैसे बाहरी उपकरणों का उपयोग किए बिना स्टार्टअप पर एक डेमन के रूप में चलाना चाहूंगा


लिनक्स डेमन राइटिंग HOWTO

लिनक्स डेमन राइटिंग HOWTO के अनुसार , एक उचित डेमॉन में निम्नलिखित विशेषताएं हैं:

  • मूल प्रक्रिया से कांटे
  • बंद कर देता है सभी फ़ाइल वर्णनकर्ता (यानी, stdin, stdout, stderr)
  • लेखन के लिए लॉग खोलता है (यदि कॉन्फ़िगर किया गया है)
  • लगातार (आमतौर पर ) काम करने वाली निर्देशिका को बदलता है/
  • फ़ाइल मोड मास्क (umask) रीसेट करता है
  • एक अद्वितीय सत्र आईडी (SID) बनाता है

daemonize परिचय

Daemonize परिचय आगे जाता करते हुए कहा कि एक विशिष्ट डेमॉन भी:

  • अपने नियंत्रण टर्मिनल से अलग हो जाता है (अगर वहाँ एक है) और सभी टर्मिनल संकेतों को अनदेखा करता है
  • इसके प्रक्रिया समूह से अलग हो जाता है
  • हैंडल SIGCLD

मैं कैसे एक में यह सब करना होगा sh, dashया bashकेवल आम लिनक्स उपकरणों के साथ स्क्रिप्ट?

स्क्रिप्ट अतिरिक्त सॉफ्टवेयर के बिना संभव के रूप में कई विकृतियों पर चलने में सक्षम होना चाहिए, हालांकि डेबियन हमारा प्राथमिक फोकस है।


नोट: मैं जानता हूँ कि वहाँ पर जवाब के बहुत सारे हैं StackExchange के उपयोग की सिफारिश नेटवर्क nohupया setsid, लेकिन न तो इन तरीकों टैकल के उपर्युक्त सभी आवश्यकताओं को।


संपादित करें: डेमॉन (7) मैनपेज भी कुछ संकेत दिए गए हैं, हालांकि बड़े-शैली के बीच कुछ मतभेद होने लगते हैं देता है SysVडेमॉन और नए systemdलोगों को। चूंकि विभिन्न प्रकार के डिस्ट्रोस के साथ संगतता महत्वपूर्ण है, कृपया सुनिश्चित करें कि उत्तर किसी भी अंतर को स्पष्ट करता है।



1
अपनी स्वयं की शेल स्क्रिप्ट को तैयार करने का "उचित" तरीका यह है कि आप इसे अपनी लॉगिंग करें, इसे डेमॉन के रूप में लॉन्च करने के लिए एक विधि प्रदान करें, आदि जैसी चीजें daemonऔर वे अन्य चीजें मनमाने ढंग से शेल स्क्रिप्ट चलाने के लिए हैं जैसे कि चलाने के लिए कोई प्रावधान नहीं है। एक डेमन। चूंकि आप लेखक हैं, पूरी तरह से उस स्क्रिप्ट के नियंत्रण में है, इसलिए इसे बनाएं ताकि इसे सिस्टमड यूनिटफाइल या आरडीडी स्क्रिप्ट से लॉन्च किया जा सके। आपने "उचित" निर्दिष्ट किया !
रिच

जवाबों:


16

सिस्टमड का उपयोग करके आपको एक सरल इकाई बनाकर एक स्क्रिप्ट को डेमॉन के रूप में चलाने में सक्षम होना चाहिए। बहुत सारे अलग-अलग विकल्प हैं जिन्हें आप जोड़ सकते हैं लेकिन यह लगभग उतना ही सरल है जितना कि आप प्राप्त कर सकते हैं।

कहते हैं कि आपके पास एक स्क्रिप्ट है /usr/bin/mydaemon

#!/bin/sh

while true; do
  date;
  sleep 60;
done

आप एक इकाई बनाएँ /etc/systemd/system/mydaemon.service

[Unit]
Description=My daemon

[Service]
ExecStart=/usr/bin/mydaemon
Restart=on-failure

[Install]
WantedBy=multi-user.target 

आपके द्वारा चलाए जा रहे दानव को शुरू करने के लिए

systemctl start mydaemon.service 

बूट शुरू करने के लिए आप इसे सक्षम करें

systemctl enable mydaemon.service

यदि सिस्टम आधारित प्रणाली पर, जो कि अधिकांश लिनक्स वितरण आज हैं, तो यह वास्तव में एक बाहरी उपकरण नहीं है। नकारात्मक यह होगा कि यह हर जगह काम नहीं करेगा।


3
जबकि मुझे सिस्टमड दृष्टिकोण पसंद है, ओपी ने कहा "कोई बाहरी उपकरण नहीं"। ऐसे लिनक्स डिस्ट्रीब्यूशन हैं जिनके पास अभी तक सिस्टमड नहीं है, या आप सिस्टमड और कुछ और के बीच चयन का उपयोग करते हैं, जैसे ओपनआरआरसी।
बजे क्रिस्टियन सियुपिटु

5
सिस्टम का उपयोग करने वाले डिस्ट्रोस के लिए, systemd"बाहरी उपकरण" से अधिक नहीं है bash
अलेक्जेंडर

7

मुझे शायद यहाँ कुछ याद आ रहा है; क्यों nohupउचित नहीं होगा? बेशक यह अकेले पर्याप्त नहीं है , लेकिन पूरक यह सीधा लगता है।

#!/bin/bash

if [ "$1" = "DAEMON" ]; then
    # is this necessary? Add other signals at will (TTIN TTOU INT STOP TSTP)
    trap '' INT
    cd /tmp
    shift
    ### daemonized section ######
    for i in $( seq 1 10 ); do
        date
        sleep 5
    done
    #### end of daemonized section ####
    exit 0
fi

export PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/sbin:/usr/local/bin
umask 022
# You can add nice and ionice before nohup but they might not be installed
nohup setsid $0 DAEMON $* 2>/var/log/mydaemon.err >/var/log/mydaemon.log &

जहा तक मै देख सकता हू:

  • उत्पादन उचित रूप से पुनर्निर्देशित किया गया है (यदि आवश्यक हो तो / dev / null का उपयोग करें)
  • umask विरासत में मिला है
  • stdin हालांकि, मूल स्क्रिप्ट के अंत में मर जाता है
  • डेमन.श लिपि को init(या systemd) पुन: प्रस्तुत किया जाता है

मुझे एक मजबूत एहसास है कि मैं स्पष्ट याद कर रहा हूं। डाउनवोट, लेकिन कृपया मुझे बताएं कि यह क्या है :-)


2
मैं कुछ इसी तरह का सुझाव देने वाला था। मैं कई गैर-गैर- उपयोगिताओं को लॉन्च करने के लिए I / O पुनर्निर्देशन के nohupसाथ उपयोग करता &हूं और Cसंभवतः गैर-विशेषाधिकार प्राप्त उपयोगकर्ता के रूप में डेमन को चलाने के लिए आपके nohupकमांड को अंदर लपेटने की अतिरिक्त सुरक्षा है su -c "nohup ... &" -s /bin/bash systemUser
१११ ---

4

screenअधिकांश डिस्ट्रोस में निहित लिनक्स कमांड एक शेल स्क्रिप्ट को निष्क्रिय कर सकता है। मैं अक्सर इसका इस्तेमाल करता हूं। यहाँ एक त्वरित उदाहरण है शुरू करने के लिए, सूची, और एक अलग स्क्रीन सत्र छोड़ ...

# screen -dmS Session_Name  bash -c "while true; do date; sleep 60; done"

# screen -ls
There are screens on:
        8534.Session_Name       (04/04/2018 08:46:27 PM)        (Detached)

# screen -S Session_Name -X quit

2
screenखोल स्क्रिप्ट नहीं बहरा करता है। यह बस उन्हें विशिष्ट टर्मिनल में चलाता है और समापन सत्र के बिना इस टर्मिनल (जैसे पीसी से अनप्लग कीबोर्ड) से अलग हो सकता है। इसलिए, अलग टर्मिनल में चल रहा प्रोग्राम पृष्ठभूमि में चल रहा है। इसलिए - पृष्ठभूमि में पास प्रोग्राम को अलग करें।
योरिज गोनचारुक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.