2010-01-30 47 views
12

Tôi đã viết một tập lệnh bash để khởi động lại Apache khi nó treo và gửi email cho quản trị viên. Các mã được hiển thị dưới đây. mã sẽ khởi động lại Apache nếu số lượng tiến trình Apache bằng không. Vấn đề là: Apache một số thời gian treo và các quá trình vẫn không phải là số không, vì vậy trong trường hợp này kịch bản sẽ không khởi động lại Apache. Điều cần thiết là: làm cách nào để sửa đổi mã để khởi động lại Apache nếu nó bị treo và các quá trình không phải là 0.bash script để khởi động lại Apache tự động

#!/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

Fix bệnh, không phải là triệu chứng. Bạn nên hỏi làm thế nào để xác định lý do tại sao apache là treo (có lẽ trong ServerFault) và sau đó sửa chữa mà ... không phải làm thế nào để khởi động lại nó khi nó treo cứng. – Juliano

+0

Tại sao bạn phát minh lại bánh xe ở đây, các tập lệnh khởi động được tìm thấy trong /etc/rc.d hoặc tương tự (tùy thuộc vào cài đặt unix/linux) có khả năng khởi động lại, nhưng sau đó lại kiểm tra nhật ký lỗi của bạn phải khởi động lại máy chủ, thường là /etc/rc.d/3/rc.httpd restart hoặc tương tự ... – t0mm13b

+1

Xin chào. Juliano bạn nói đúng. Tôi đang tìm nguyên nhân gốc rễ của vấn đề nhưng tôi nghĩ kiểu kịch bản này là "phải có" bởi vì nó có thể trong tương lai nó sẽ treo và kịch bản này sẽ tạm thời giải quyết vấn đề. –

Trả lời

29

Chúng tôi đã từng có Apache segfaulting đôi khi trên một máy; đây là tập lệnh mà chúng tôi đã sử dụng để gỡ lỗi sự cố trong khi vẫn giữ Apache. Nó chạy từ cron (như root) một lần mỗi phút hoặc lâu hơn. Nó phải tự giải thích.

#!/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 

Chúng tôi chưa bao giờ hình dung ra vấn đề ...

+7

Điều đó 'rm-rf' làm tôi lo lắng. Có vẻ như bạn đang viết hai tệp. Chỉ cần xóa chúng một cách rõ ràng sau đó 'rmdir $ THEDIR'. –

+0

Cái nào tốt hơn để kiểm tra máy chủ apache, sử dụng wget hoặc kiểm tra trạng thái của apache bằng trạng thái /etc/init.d/httpd? Tôi đang suy nghĩ sử dụng wget sẽ đặt căng thẳng hơn cho máy chủ. – geckob

+2

Tôi chắc chắn sẽ khuyên bạn nên sử dụng một yêu cầu http thực tế, bởi vì nếu Apache chỉ treo cứng vòng hoặc một cái gì đó (tức là quá trình vẫn đang chạy), init script sẽ không cho bạn biết. Và nếu máy chủ của bạn không thể xử lý một yêu cầu mỗi phút, thì Apache bị lỗi là điều bạn lo lắng nhất;) – Thomas

1

Bạn có thể thử để gửi một yêu cầu http apache (ví dụ sử dụng wget --timeout=10) và nếu điều đó yêu cầu lần ra hay thất bại (trạng thái thoát! = 0), bạn giết và khởi động lại apache.

1

Tại sao Apache sẽ treo? Bạn có thể nhận được để gây ra?

Có một số tập lệnh và công cụ để thực hiện các ứng dụng 'daemonize' và xem chúng. Có vẻ như bạn đang sử dụng Debian hoặc Ubuntu, hãy xem các gói daemondaemontools. Tôi chắc chắn cũng có những người khác.

2

Số lượng quá trình có thực sự nhỏ hơn 0 không?

Như vậy là đủ:

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

Tôi không thấy điều này có liên quan như thế nào, tuy nhiên nó có thể đúng. –

Các vấn đề liên quan