शीर्ष-अपवृत्त उत्तरों में से कुछ यहां कुछ महत्वपूर्ण भागों को याद कर रहे हैं जो एक डेमॉन को एक डेमन बनाते हैं, जैसा कि सिर्फ एक पृष्ठभूमि प्रक्रिया, या एक शेल से अलग की गई पृष्ठभूमि प्रक्रिया के विपरीत है।
यह http://www.faqs.org/faqs/unix-faq/programmer/faq/ वर्णन करता है कि डेमॉन बनने के लिए क्या आवश्यक है। और यह रन बैश स्क्रिप्ट डेमिन के रूप में सेटिड को लागू करती है, हालांकि यह चिरिर को रूट करने से चूक जाती है।
मूल पोस्टर का प्रश्न वास्तव में "मैं बैश का उपयोग करके डेमॉन प्रक्रिया कैसे बनाऊं" की तुलना में अधिक विशिष्ट था, लेकिन चूंकि विषय और उत्तर शैल स्क्रिप्टिंग के बारे में आम तौर पर चर्चा करते हैं, इसलिए मुझे लगता है कि इसे इंगित करना मेरे लिए महत्वपूर्ण है (जैसे कि मेरे लिए देख रहे इंटरपोलर्स के लिए) एक डेमॉन बनाने का अच्छा विवरण)।
यहाँ एक शेल स्क्रिप्ट का मेरा प्रतिपादन है जो एफएक्यू के अनुसार व्यवहार करेगा। true
सुंदर आउटपुट देखने के लिए DEBUG सेट करें (लेकिन यह अंतहीन रूप से लूप करने के बजाय तुरंत बाहर निकलता है):
#!/bin/bash
DEBUG=false
trap process_USR1 SIGUSR1
process_USR1() {
echo 'Got signal USR1'
echo 'Did you notice that the signal was acted upon only after the sleep was done'
echo 'in the while loop? Interesting, yes? Yes.'
exit 0
}
print_debug() {
whatiam="$1"; tty="$2"
[[ "$tty" != "not a tty" ]] && {
echo "" >$tty
echo "$whatiam, PID $$" >$tty
ps -o pid,sess,pgid -p $$ >$tty
tty >$tty
}
}
me_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
me_FILE=$(basename $0)
cd /
if [ "$1" = "child" ] ; then
shift; tty="$1"; shift
$DEBUG && print_debug "*** CHILD, NEW SESSION, NEW PGID" "$tty"
umask 0
$me_DIR/$me_FILE XXrefork_daemonXX "$tty" "$@" </dev/null >/dev/null 2>/dev/null &
$DEBUG && [[ "$tty" != "not a tty" ]] && echo "CHILD OUT" >$tty
exit 0
fi
if [ "$1" != "XXrefork_daemonXX" ] ; then
tty=$(tty)
$DEBUG && print_debug "*** PARENT" "$tty"
setsid $me_DIR/$me_FILE child "$tty" "$@" &
$DEBUG && [[ "$tty" != "not a tty" ]] && echo "PARENT OUT" >$tty
exit 0
fi
exec >/tmp/outfile
exec 2>/tmp/errfile
exec 0</dev/null
shift; tty="$1"; shift
$DEBUG && print_debug "*** DAEMON" "$tty"
$DEBUG && [[ "$tty" != "not a tty" ]] && echo NOT A REAL DAEMON. NOT RUNNING WHILE LOOP. >$tty
$DEBUG || {
while true; do
echo "Change this loop, so this silly no-op goes away." >/dev/null
echo "Do something useful with your life, young padawan." >/dev/null
sleep 10
done
}
$DEBUG && [[ "$tty" != "not a tty" ]] && sleep 3 && echo "DAEMON OUT" >$tty
exit
जब DEBUG
सेट किया जाता है तो आउटपुट इस तरह दिखता है true
। ध्यान दें कि सत्र और प्रक्रिया समूह ID (SESS, PGID) नंबर कैसे बदलते हैं:
<shell_prompt>$ bash blahd
*** PARENT, PID 5180
PID SESS PGID
5180 1708 5180
/dev/pts/6
PARENT OUT
<shell_prompt>$
*** CHILD, NEW SESSION, NEW PGID, PID 5188
PID SESS PGID
5188 5188 5188
not a tty
CHILD OUT
*** DAEMON, PID 5198
PID SESS PGID
5198 5188 5188
not a tty
NOT A REAL DAEMON. NOT RUNNING WHILE LOOP.
DAEMON OUT