bash - शेल स्क्रिप्ट डिमन बनाने का सबसे अच्छा तरीका?




shell (7)

मैं सोच रहा हूं कि क्या एक डिमन बनाने का एक बेहतर तरीका है जो केवल कुछ के लिए उपयोग करने के लिए कुछ इंतजार कर रहा है:

#! /bin/sh
trap processUserSig SIGUSR1
processUserSig() {
  echo "doing stuff"
}

while true; do
  sleep 1000
done

विशेष रूप से, मैं सोच रहा हूं कि लूप से छुटकारा पाने का कोई तरीका है और अभी भी सिग्नल के लिए बात सुनी है।



अगर मेरे पास एक script.sh थी script.sh और मैं इसे बैश से निष्पादित करना चाहता था और जब भी मैं अपने बैश सत्र को बंद करना चाहता हूं तब भी इसे चलाना चाहता था, फिर मैं nohup और अंत में गठबंधन करता।

उदाहरण: nohup ./script.sh < inputFile.txt > ./logFile 2>&1 &

inputFile.txt कोई भी फाइल हो सकती है। अगर आपकी फ़ाइल में कोई इनपुट नहीं है तो हम आमतौर पर /dev/null उपयोग करते हैं। तो आदेश होगा:

nohup ./script.sh < /dev/null > ./logFile 2>&1 &

उसके बाद अपने बैश सत्र को बंद करें, एक और टर्मिनल खोलें और निष्पादित करें: ps -aux | egrep "script.sh" ps -aux | egrep "script.sh" और आप देखेंगे कि आपकी स्क्रिप्ट पृष्ठभूमि में अभी भी चल रही है। Cource के, अगर आप इसे रोकना चाहते हैं तो उसी आदेश (पीएस) निष्पादित करें और kill -9 <PID-OF-YOUR-SCRIPT>


बस अपनी स्क्रिप्ट ( ./myscript & ) को पृष्ठभूमिबद्ध करना इसे खराब नहीं करेगा। http://www.faqs.org/faqs/unix-faq/programmer/faq/ , सेक्शन 1.7 देखें, जो वर्णन करता है कि डिमन बनने के लिए क्या आवश्यक है। आपको इसे टर्मिनल से डिस्कनेक्ट करना होगा ताकि SIGHUP इसे मार न सके। आप एक स्क्रिप्ट को डेमॉन की तरह कार्य करने के लिए शॉर्टकट ले सकते हैं;

nohup ./myscript 0<&- &>/dev/null &

काम करेगा या, एक फ़ाइल में stderr और stdout दोनों को पकड़ने के लिए:

nohup ./myscript 0<&- &> my.admin.log.file &

हालांकि, ऐसे महत्वपूर्ण पहलू भी हो सकते हैं जिन पर आपको विचार करने की आवश्यकता है। उदाहरण के लिए:

  • आपके पास अभी भी स्क्रिप्ट के लिए एक फ़ाइल डिस्क्रिप्टर खुला होगा, जिसका अर्थ यह है कि जिस निर्देशिका में इसे घुमाया गया है वह अनमाउंट होगा। एक सच्चे डिमन होने के लिए आपको chdir("/") (या cd / अपनी स्क्रिप्ट के अंदर) चाहिए, और कांटा ताकि माता-पिता निकल जाएं, और इस प्रकार मूल वर्णनकर्ता बंद हो।
  • शायद umask 0 चलाएं। आप डिमन के कॉलर के उमास्क पर निर्भर नहीं रहना चाहेंगे।

एक स्क्रिप्ट के उदाहरण के लिए जो इन सभी पहलुओं को ध्यान में रखता है, माइक एस का जवाब देखें


यह वास्तव में निर्भर करता है कि द्विआधारी क्या करने जा रहा है।

उदाहरण के लिए मैं कुछ श्रोता बनाना चाहता हूं।

प्रारंभिक डेमॉन सरल कार्य है:

lis_deamon:

#!/bin/bash

# We will start the listener as Deamon process
#    
LISTENER_BIN=/tmp/deamon_test/listener
test -x $LISTENER_BIN || exit 5
PIDFILE=/tmp/deamon_test/listener.pid

case "$1" in
      start)
            echo -n "Starting Listener Deamon .... "
            startproc -f -p $PIDFILE $LISTENER_BIN
            echo "running"
            ;;
          *)
            echo "Usage: $0 start"
            exit 1
            ;;
esac

इस प्रकार हम डेमन शुरू करते हैं (सभी /etc/init.d/ कर्मचारियों के लिए सामान्य तरीका)

अब श्रोता के लिए यह स्वयं है, यह किसी प्रकार का लूप / अलर्ट होना चाहिए या अन्यथा जो स्क्रिप्ट को आप जो चाहते हैं उसे करने के लिए ट्रिगर करेगा। उदाहरण के लिए यदि आप अपनी स्क्रिप्ट को 10 मिनट सोना चाहते हैं और जागते हैं और पूछते हैं कि आप कैसे कर रहे हैं तो आप इसे करेंगे

while true ; do sleep 600 ; echo "How are u ? " ; done

यहां एक सरल श्रोता है जो आप कर सकते हैं जो आपके आदेशों को रिमोट मशीन से सुनेंगे और उन्हें स्थानीय पर निष्पादित करेगा:

श्रोता:

#!/bin/bash

# Starting listener on some port
# we will run it as deamon and we will send commands to it.
#
IP=$(hostname --ip-address)
PORT=1024
FILE=/tmp/backpipe
count=0
while [ -a $FILE ] ; do #If file exis I assume that it used by other program
  FILE=$FILE.$count
  count=$(($count + 1))
done

# Now we know that such file do not exist,
# U can write down in deamon it self the remove for those files
# or in different part of program

mknod $FILE p

while true ; do 
  netcat -l -s $IP -p $PORT < $FILE |/bin/bash > $FILE
done
rm $FILE

तो इसे यूपी शुरू करने के लिए: / tmp / deamon_test / श्रोता शुरू करें

और खोल से आदेश भेजने के लिए (या इसे स्क्रिप्ट में लपेटें):

test_host#netcat 10.184.200.22 1024
uptime
 20:01pm  up 21 days  5:10,  44 users,  load average: 0.62, 0.61, 0.60
date
Tue Jan 28 20:02:00 IST 2014
 punt! (Cntrl+C)

उम्मीद है कि यह मदद करेगा।


start-stop-daemon जैसे सिस्टम की डिमन सुविधा का उपयोग करें।

अन्यथा, हाँ, कहीं लूप होना है।


$ ( cd /; umask 0; setsid your_script.sh </dev/null &>/dev/null & ) &


# double background your script to have it detach from the tty
# cf. http://www.linux-mag.com/id/5981 
(./program.sh &) & 





shell