2010-01-30 10 views
12

मैंने अपाचे को पुनरारंभ करने के लिए एक बैश स्क्रिप्ट लिखी और व्यवस्थापक को ईमेल भेज दिया। कोड नीचे दिखाया गया है। यदि अपाचे प्रक्रिया की संख्या शून्य है तो कोड अपाचे को पुनरारंभ करेगा। समस्या यह है: अपाचे कुछ समय लटकता है और प्रक्रियाएं अभी भी शून्य नहीं होती हैं, इसलिए इस मामले में स्क्रिप्ट अपाचे को पुनरारंभ नहीं करेगा। आवश्यक है: अगर मैं लटका हुआ है और प्रक्रिया शून्य नहीं है, तो अपाचे को पुनरारंभ करने के लिए मैं कोड को कैसे संशोधित करूं।स्वचालित रूप से अपाचे को पुनरारंभ करने के लिए bash स्क्रिप्ट

#!/bin/bash 
if [ `pgrep apache2 -c` -le "0" ]; then 
/etc/init.d/apache2 stop 
pkill -u www-data 
/etc/init.d/apache2 start 
echo "restarting....." 
SUBJECT="Apache auto restart" 
# Email To ? 
EMAIL="[email protected]" 
# Email text/message 
EMAILMESSAGE="apache auto restart done" 
# send an email using /bin/mail 
/bin/mail -s "$SUBJECT" "$EMAIL" "$EMAILMESSAGE" 
fi 
+7

रोग, नहीं लक्षण को ठीक करें। आपको यह पूछना चाहिए कि अपाचे क्यों लटका रहा है (शायद सर्वरफॉल्ट में) और फिर इसे ठीक करें ... इसे लटकते समय इसे पुनरारंभ करने के लिए कैसे नहीं। – Juliano

+0

आपने यहां पहिया को फिर से क्यों शुरू किया, /etc/rc.d या इसी तरह की स्टार्टअप स्क्रिप्ट्स (यूनिक्स/लिनक्स स्थापना के आधार पर) में पुनरारंभ करने की क्षमता है, लेकिन फिर, अपने त्रुटि लॉग जांचें कि आप क्यों हैं सर्वर को पुनरारंभ करना होगा, आमतौर पर /etc/rc.d/3/rc.httpd पुनरारंभ या समान ... – t0mm13b

+1

हाय। जूलियानो आप सही हैं। मैं समस्या के मूल कारण की तलाश में हूं लेकिन मुझे लगता है कि इस तरह की स्क्रिप्ट एक "होना चाहिए" क्योंकि भविष्य में यह संभव है कि यह लटकाएगा और यह स्क्रिप्ट समस्या को अस्थायी रूप से हल करेगी। –

उत्तर

29

हम एक मशीन पर कभी कभी अपाचे segfaulting किया करते थे; यहां दी गई स्क्रिप्ट है जिसे हम अपाचे को बनाए रखते हुए समस्या को डीबग करने का प्रयास करते थे। यह हर मिनट या तो एक बार क्रॉन (रूट के रूप में) से भाग गया। यह आत्म-व्याख्यात्मक होना चाहिए।

#!/bin/sh 
# Script that checks whether apache is still up, and if not: 
# - e-mail the last bit of log files 
# - kick some life back into it 
# -- Thomas, 20050606 

PATH=/bin:/usr/bin 
THEDIR=/tmp/apache-watchdog 
[email protected] 
mkdir -p $THEDIR 

if (wget --timeout=30 -q -P $THEDIR http://localhost/robots.txt) 
then 
    # we are up 
    touch ~/.apache-was-up 
else 
    # down! but if it was down already, don't keep spamming 
    if [[ -f ~/.apache-was-up ]] 
    then 
     # write a nice e-mail 
     echo -n "apache crashed at " > $THEDIR/mail 
     date >> $THEDIR/mail 
     echo >> $THEDIR/mail 
     echo "Access log:" >> $THEDIR/mail 
     tail -n 30 /var/log/apache2_access/current >> $THEDIR/mail 
     echo >> $THEDIR/mail 
     echo "Error log:" >> $THEDIR/mail 
     tail -n 30 /var/log/apache2_error/current >> $THEDIR/mail 
     echo >> $THEDIR/mail 
     # kick apache 
     echo "Now kicking apache..." >> $THEDIR/mail 
     /etc/init.d/apache2 stop >> $THEDIR/mail 2>&1 
     killall -9 apache2 >> $THEDIR/mail 2>&1 
     /etc/init.d/apache2 start >> $THEDIR/mail 2>&1 
     # send the mail 
     echo >> $THEDIR/mail 
     echo "Good luck troubleshooting!" >> $THEDIR/mail 
     mail -s "apache-watchdog: apache crashed" $EMAIL < $THEDIR/mail 
     rm ~/.apache-was-up 
    fi 
fi 

rm -rf $THEDIR 

हम समस्या यह पता लगाने में किया था कभी नहीं ...

+7

कि 'आरएम-आरएफ' मुझे परेशान करता है। ऐसा लगता है कि आप दो फाइलें लिख रहे हैं। बस उन्हें स्पष्ट रूप से हटाएं, फिर 'THDIRIR $ THEDIR'। –

+0

wget का उपयोग करके अपाचे सर्वर का परीक्षण करने के लिए कौन सा बेहतर है या /etc/init.d/httpd स्थिति का उपयोग करके अपाचे की स्थिति की जांच करें? मैं सोच रहा हूं कि wget का उपयोग सर्वर पर अधिक तनाव डाल देगा। – geckob

+2

मैं निश्चित रूप से एक वास्तविक http अनुरोध का उपयोग करने की अनुशंसा करता हूं, क्योंकि अगर अपाचे सिर्फ डेडलॉक्स या कुछ लटकता है (यानी प्रक्रिया अभी भी चल रही है), init स्क्रिप्ट आपको नहीं बताएगी। और यदि आपका सर्वर प्रति मिनट एक अनुरोध संभाल नहीं सकता है, तो एक क्रैशिंग अपाचे आपकी चिंताओं का कम से कम है;) – Thomas

1

आप अगर उस अनुरोध समयबाह्य एपाचे के लिए (जैसे wget --timeout=10 का प्रयोग करके) एक http अनुरोध भेजने के लिए कोशिश कर सकते हैं और या विफल रहता है (निकास स्थिति! = 0), तुम्हें मार और अपाचे पुनः आरंभ करें।

1

अपाचे क्यों लटकाएगा? क्या आप कारण प्राप्त कर सकते हैं?

वहां 'डिमोनिज़' ऐप्स के लिए कई स्क्रिप्ट और टूल हैं और उन पर नजर डालें। जैसा कि आप डेबियन या उबंटू पर हैं, पैकेज daemon और daemontools पर एक नज़र डालें। मुझे यकीन है कि कुछ भी हैं।

2

क्या प्रक्रिया की गणना वास्तव में शून्य से कम हो सकती है?

यह पर्याप्त होना चाहिए:

if ! pgrep apache2 -c >/dev/null; then 
+1

मुझे नहीं लगता कि यह कैसे प्रासंगिक है, हालांकि यह सच हो सकता है। –

संबंधित मुद्दे

 संबंधित मुद्दे