Jak automatycznie uruchamiac apache jesli proces zostal zabity - devPytania most recent 30 from http://devpytania.pl 2010-08-01T06:28:21Z http://devpytania.pl/feeds/question/879 http://www.creativecommons.org/licenses/by-nc/2.5/rdf http://devpytania.pl/questions/879/jak-automatycznie-uruchamiac-apache-jesli-proces-zostal-zabity Jak automatycznie uruchamiac apache jesli proces zostal zabity Artur 2010-02-05T21:03:34Z 2010-02-08T21:09:15Z <p>Czasami gdy serwer VPS przekroczy limit przyznanej pamięci RAM zostaje wtedy zabity proces apache. Muszę wtedy ręcznie w panelu uruchamiać ponownie apache. Czy można napisać jakąś komendę lub skrypt ktory uruchamiany przez cron sprawdzałby czy apache jest uruchomiony, po czym jesli okazałoby się że nie jest to wtedy uruchamiałby ponownie apache'a. </p> <p>coś w stylu</p> <p>if(apache == off) { włącz_proces_apache(); }</p> <p>Tylko jak to napisac i w czym, cgi? System na którym jest serwer to CentOS</p> http://devpytania.pl/questions/879/jak-automatycznie-uruchamiac-apache-jesli-proces-zostal-zabity/880#880 Answer by Michał Białas for Jak automatycznie uruchamiac apache jesli proces zostal zabity Michał Białas 2010-02-05T21:25:19Z 2010-02-05T21:35:42Z <p>Można by dodać do crona wpis:</p> <pre><code>* * * * * /etc/init.d/apache2 start </code></pre> <p>Będzie próbował uruchomić apacha co minutę, a jeżeli jest uruchomiony to nic nie zrobi. Ewentualnie można sprawdzać stan apacha przez komendę "/etc/init.d/apache2 status" i sprawdzać wynik.</p> <p>Na CentOS pewnie skrypt nazywa się httpd zamiast apache2.</p> http://devpytania.pl/questions/879/jak-automatycznie-uruchamiac-apache-jesli-proces-zostal-zabity/881#881 Answer by y3ti for Jak automatycznie uruchamiac apache jesli proces zostal zabity y3ti 2010-02-05T21:26:24Z 2010-02-05T21:26:24Z <p>Można. Poczytaj sobie o monicie: <a href="http://mmonit.com/monit/" rel="nofollow">http://mmonit.com/monit/</a>.</p> <p>W skrócie. Działa to w ten sposób, że co wybrany przez Ciebie okres czasu monit sprawdza czy działa sobie apache (czy istnieje proces apache o pidzie podanym w pliku). Jeśli jest to ok, jeśli nie to go startuje.</p> <p>Monit może też kontrolować zużycie zasobów tj. czy taki apache nie narobił za dużo dzieciaków, nie wpiernicza za dużo ramu, czy też CPU. Najlepiej zobacz sobie na stronę, którą Ci podałem wyżej. Tam są też przykłady zastosowania do apache.</p> http://devpytania.pl/questions/879/jak-automatycznie-uruchamiac-apache-jesli-proces-zostal-zabity/882#882 Answer by borzole for Jak automatycznie uruchamiac apache jesli proces zostal zabity borzole 2010-02-05T22:35:08Z 2010-02-06T13:22:20Z <pre><code>#!/bin/bash SERVICE=${1:-httpd} service $SERVICE status | grep "uruchomiony..." RC=$? if [ $RC -eq 0 ] ; then echo "$SERVICE działa" else echo "$SERVICE nie działa, uruchamiam" service $SERVICE start fi </code></pre> <p>Wrzuć taki skrypt do cron, a jak nie masz włączonego cron to dopisz na końcu rekurencje:</p> <pre><code>sleep 60 $0 </code></pre> <p>Skrypt monitoruje <strong>httpd</strong> lub nazwę usługi podaną jako parametr.</p> <p><strong>[EDIT]</strong></p> <p>ta wersja będzie mniej "gadatliwa"</p> <pre><code>#!/bin/bash SERVICE=${1:-httpd} service $SERVICE status | grep "uruchomiony..." &gt;/dev/null RC=$? if [ $RC -ne 0 ] ; then echo "$SERVICE nie działa, uruchamiam" service $SERVICE start fi </code></pre> <p><strong>[EDIT]</strong></p> <p>skrypt zapisać jako np.:</p> <pre><code>/usr/local/bin/zawsze_dziala.sh </code></pre> <p>dodać prawa wykonywania:</p> <pre><code>chmod +x /usr/local/bin/zawsze_dziala.sh </code></pre> <p>uruchomić edycję tablicy cron poleceniem</p> <pre><code>crontab -e </code></pre> <p>wpisać</p> <pre><code>PATH=$PATH:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin * * * * * zawsze_dziala.sh &gt;&gt;/root/zawsze_dziala.log 2&gt;&amp;1 </code></pre> http://devpytania.pl/questions/879/jak-automatycznie-uruchamiac-apache-jesli-proces-zostal-zabity/892#892 Answer by Artur for Jak automatycznie uruchamiac apache jesli proces zostal zabity Artur 2010-02-06T23:57:23Z 2010-02-06T23:57:23Z <p>Znalazłem również taki skrypt, który sprawdza czy ładuje się strona: <a href="http://www.mail-archive.com/pld-users-pl@pld-linux.org/msg15223.html" rel="nofollow">http://www.mail-archive.com/pld-users-pl@pld-linux.org/msg15223.html</a> Przerobiłem sobie właśnie i działa to tak, że jeśli nie ładuje się www to resetuje apache. Dla testu wyłączyłem apache i po 1min sam się uruchomił. Mam nadzieję, że podobnie skrypt będzie działał w przypadku zwisu serwera, co sprawdzę przeglądając logi.</p> <pre><code>#!/bin/sh wget -q -O /dev/null http://www.domena.pl/; if [ "$?" = "1" ]; then /sbin/service httpd restart &gt;&gt; /dev/null 2&gt;&amp;1 date +%F,%H:%M:%S echo "Nie mozna bylo polaczyc sie ze strona www, zresetowano apache" fi </code></pre> <p>Do crona dodałem komendę </p> <pre><code>* * * * * /usr/local/bin/restart_apache_when_website_off.sh &gt;&gt; /usr/local/bin/my_log/restart_apache_when_website_off.log 2&gt;&amp;1 </code></pre> <p>Utworzyłem sobie katalog my_log w /usr/local/bin/ No i oczywiście dla pliku restart_apache_when_website_off.sh ustawiony jest chmod z możliwością wykonania przez właściciela (744) Może się komuś ten skrypt też przyda :) Dzięki wszystkim za pomoc!</p> <p>PS. W jaki sposób można zapisać datę na równi z napisem bo nie mogłem tego rozgryźć. Najlepiej aby to wyglądało tak [Y-m-d H:i:s] Text komunikatu</p> http://devpytania.pl/questions/879/jak-automatycznie-uruchamiac-apache-jesli-proces-zostal-zabity/895#895 Answer by Artur for Jak automatycznie uruchamiac apache jesli proces zostal zabity Artur 2010-02-07T11:53:23Z 2010-02-07T11:53:23Z <p>Mam log z nocy:</p> <blockquote> <p>2010-02-07,00:51:01 Nie mozna bylo polaczyc sie ze strona www, zresetowano apache 2010-02-07,02:02:02 Nie mozna bylo polaczyc sie ze strona www, zresetowano apache 2010-02-07,02:06:01 Nie mozna bylo polaczyc sie ze strona www, zresetowano apache 2010-02-07,03:45:06 Nie mozna bylo polaczyc sie ze strona www, zresetowano apache 2010-02-07,03:45:07 Nie mozna bylo polaczyc sie ze strona www, zresetowano apache wget: error while loading shared libraries: libresolv.so.2: cannot open shared object file: Error 23 /bin/sh: /usr/local/bin/restart_apache_when_website_off.sh: Too many open files in system wget: error while loading shared libraries: libresolv.so.2: cannot open shared object file: Error 23 2010-02-07,12:42:15 Nie mozna bylo polaczyc sie ze strona www, zresetowano apache 2010-02-07,12:42:15 Nie mozna bylo polaczyc sie ze strona www, zresetowano apache 2010-02-07,12:42:16 Nie mozna bylo polaczyc sie ze strona www, zresetowano apache</p> </blockquote> <p>Dziwi mnie to dlaczego np. skrypt wywołał się jakby co sekundę, ostatnie 3 linijki? Dlaczego tak się może dziać??</p> http://devpytania.pl/questions/879/jak-automatycznie-uruchamiac-apache-jesli-proces-zostal-zabity/912#912 Answer by y3ti for Jak automatycznie uruchamiac apache jesli proces zostal zabity y3ti 2010-02-08T11:00:12Z 2010-02-08T11:00:12Z <p>Zobacz logi w systemie </p> <pre><code>/var/log/syslog /var/log/cron.log /var/log/messeges </code></pre> <p>i poszukaj jak skrypt był uruchamiany i z jaką częstotliwością. Teraz trudno powiedzieć czemu tak się stało. Jedyne co mi przychodzi do głowy, to taka sytuacja:</p> <pre><code>1 minuta: odpala się skrypt, apache wisi wget długo pobiera stronę 2 minuta: odpala się skrypt, apache wisi wget długo pobiera stronę 3 minuta: odpala się skrypt, apache wisi, skrypt też wisi bo jest duży load na maszyne </code></pre> <p>mija trochę czasu, load spada i skrypty dostają czas procesora procesora, więc się wykonują. Zbiegiem okoliczności jest ta sama sekunda. Druga opcja to sytuacja, w której masz taką sytuację:</p> <p>Założenia: - duży load na maszynie - wysokie zużycie zasoboów (IO, cpu, mem)</p> <pre><code>1 minuta: skrypt jeden zostaje uruchomiony, wget łapie time out po minucie, resetuje apache 2 minuta: skrypt zostaje uruchomiony, apache jest restartowany (jest load na maszynie, więc długo wstaje), w tym czasie wget zwraca błąd a Ty po raz kolejny resetujesz apache </code></pre> <p>I tak skrypty Ci się nakładają. Kolejna rzecz (błędna) w tych skryptach wszystkich jest taka, że robimy service stop. Jeśli mamy bardzo zachetaną maszynę to lepiej zrobić</p> <pre><code>ps aux | grep httpd | awk '{print $1}' | xargs kill -9 </code></pre> <p>tj. ubić wszystkie procesy i zwolnić zasoby. Restarty są kosztowne i w przypadku apache nie warto ich robić - lepiej zrobić kill -9 (szybciej doprowadzisz do rownowagi w systemie).</p> <p>Generalnie ja po raz kolejny polecam Ci monit - sprawdzone i działające rozwiązanie. Proste skrypty często się nie sprawdzają przy dużym obciążeniu i nie uwzględniają w/w przypadków.</p> http://devpytania.pl/questions/879/jak-automatycznie-uruchamiac-apache-jesli-proces-zostal-zabity/923#923 Answer by Artur for Jak automatycznie uruchamiac apache jesli proces zostal zabity Artur 2010-02-08T16:49:37Z 2010-02-08T16:49:37Z <p>Zmodyfikowałem mój kod, mianowicie linijka z wget wygląda tak:</p> <pre><code>wget -T 15 -q -O /dev/null http://www.domena.pl/; </code></pre> <p>Dodałem parametr -T 15, po 15 sekundach jeśli nie wczyta się strona to zaniechana zostaje akcja. Nie wiem natomiast do czego służy parametr -q, w dokumentacji <a href="http://www.gnu.org/software/wget/manual/html_node/Download-Options.html" rel="nofollow">http://www.gnu.org/software/wget/manual/html_node/Download-Options.html</a> znalazłem tylko parametr z dużej litery -Q</p> <p>Ustawiłem mój skrypt na wywołanie co 2min. Zobaczę co będzie w logach.</p> <p>Jeśli chciałbym zastąpić restart całego apache Twoją metodą to powinienem zastąpić linijkę:</p> <pre><code>/sbin/service httpd restart &gt;&gt; /dev/null 2&gt;&amp;1 </code></pre> <p>na tą:</p> <pre><code>ps aux | grep httpd | awk '{print $1}' | xargs kill -9 </code></pre> <p>Co oznaczają |, grep, awk ? Czytałem o kilku komendach ps aux i kill -9, ale reszty jeszcze nie znam i nie wiem co oznacza znak |</p> <p>Czytałem o monit i fajna sprawa tylko na razie trochę jest to zbyt skomplikowane dla mnie. Przejrzałem kilka artykułów np. <a href="http://blog.hostonnet.com/installing-monit-on-linux-centos-server" rel="nofollow">http://blog.hostonnet.com/installing-monit-on-linux-centos-server</a> i <a href="http://www.howtoforge.com/server-monitoring-with-munin-and-monit-on-centos-5.2" rel="nofollow">http://www.howtoforge.com/server-monitoring-with-munin-and-monit-on-centos-5.2</a> Planuje zainstalować u siebie na kompie w virtualboxie centosa i popróbować bo nie chce czegoś namieszać w serwerze VPS, już raz źle wpisałem komendę i cały system padł - skończyło się na reinstalacji i wgrywaniu na nowo stron.</p> <p>Dzięki za pomoc!</p> http://devpytania.pl/questions/879/jak-automatycznie-uruchamiac-apache-jesli-proces-zostal-zabity/927#927 Answer by y3ti for Jak automatycznie uruchamiac apache jesli proces zostal zabity y3ti 2010-02-08T19:08:52Z 2010-02-08T19:08:52Z <p>Po kolei wget:</p> <pre><code>[y3ti@Macintosh:~/]$ wget --help | grep q -q, --quiet cisza (żadnych komunikatów). -Q, --quota=ROZMIAR ustawia ograniczenie pobieranych danych -p, --page-requisites pobiera wszystkie pliki graficzne itp. potrzebne </code></pre> <p>Jak mówi help wget z opcją -q nie będzie wyświetlał żadnych komunikatów. Co do linuksa to widzę, że jesteś bardzo początkujący i dużo można by pisać na pytania, które zadajesz. Trzymaj gotowca (przerobiony Twój skrypt):</p> <pre><code>#!/bin/sh wget -q -O /dev/null http://www.domena.pl/; if [ "$?" = "1" ]; then ps aux | grep http | awk '{print $2}' | xargs kill -9 &gt; /dev/null 2&gt;&amp;1 /sbin/service httpd restart date +%F,%H:%M:%S echo "Nie mozna bylo polaczyc sie ze strona www, zresetowano apache" fi </code></pre> <p>Zapisz go sobie tak jak ten restart_apache_when_website_off.sh.</p> <p>Co do pytań o te ps aux | grep .... </p> <p>ps aux - wyświetla wszystkie procesy działające w systemie | - tzw. potok (wyjście jednego programu - to co pisze na ekranie - jest wejściem dla innego programu) grep - wybiera tylko te linie, które zawierają dany ciąg znaków (w tym wypadku http) awk '{print $2}' - wybieramy tylko drugą kolumną (czyli te cyferki - PID (process identyfikator) procesów)</p> <p>xargs kill -9 - zabijamy te wszystkie procesy. Jeśli masz problem, ze zrozumieniem to wykonaj sobie w częściach tą linijkę tj.</p> <pre><code>ps aux ps aux | grep http ps aux | grep http | awk '{print $2}' ps aux | grep http | awk '{print $2}' | xargs kill -9 # tutaj zabija Ci procesy apache </code></pre> <p>Co do monita to wystarczy go zainstalować i lekko skonfigurować. Pod tym adresem co podałeś jest wszystko pięknie wyjaśnione:</p> <p><a href="http://blog.hostonnet.com/installing-monit-on-linux-centos-server" rel="nofollow">http://blog.hostonnet.com/installing-monit-on-linux-centos-server</a></p> http://devpytania.pl/questions/879/jak-automatycznie-uruchamiac-apache-jesli-proces-zostal-zabity/929#929 Answer by Artur for Jak automatycznie uruchamiac apache jesli proces zostal zabity Artur 2010-02-08T20:01:50Z 2010-02-08T20:01:50Z <p>Dzięki za wytłumaczenie.</p> <p>Zauważyłem dziwną przypadłość, otóż po godzinie działania serwisu wykonał się restart i wszystko dalej było ok. Po jakimś czasie zwiesił się serwer i mimo iż skrypt się wykonał to apache nie wstawał (mówię o tym poleceniu które miałem na samym początku <strong>/sbin/service httpd restart</strong>). Zalogowałem się do Plesk Panelu który pokazał mi, że apache jest wyłączony, więc dałem uruchom ale wyskoczył mi taki komunikat:</p> <pre><code>Unable to make action: Unable to manage service by websrvmng: websrvmng: Service /etc/init.d/httpd failed to restart ('--start', 'web') </code></pre> <p>Stąd wysunąłem wniosek, że czasami zwykły restart apache nie wystarcza, dlatego zastąpiłem restart httpd komendą <strong>shutdown -r t 5</strong> i na razie czekam aż się zdarzy ponowny zwis. Chyba jedynie twardy restart systemu gwarantuje, że wystartuje apache poprawnie. </p> <p>Chyba będę musiał wykupić VPS z większą ilością RAMu bo obecnie mam limit na 200mb i coś mi się wydaje, że to może jest przyczyna zamuły bo czasami dochodzi do 180mb użycia a widziałem, że polecenie top czasem pokazywało nawet 190mb i raz nawet ponad 200mb.</p> http://devpytania.pl/questions/879/jak-automatycznie-uruchamiac-apache-jesli-proces-zostal-zabity/930#930 Answer by y3ti for Jak automatycznie uruchamiac apache jesli proces zostal zabity y3ti 2010-02-08T21:09:15Z 2010-02-08T21:09:15Z <p>Moim zdaniem za bardzo kombinujesz :)</p>