LINUX.ORG.RU
ФорумAdmin

Как автоматом убивать повисшие скрипты php


0

1

Всем привет!

Есть проблема недостатка памяти. Вижу в top следующую картину:

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
30157 mysql     15   0 1225m 840m 6148 S 25.0 22.7   1003:25 mysqld
21996 apache    16   0  571m 169m  48m S  0.0  4.6   0:47.51 httpd
22017 apache    15   0  566m 148m  31m S  0.0  4.0   0:39.70 httpd
22117 apache    16   0  525m 121m  25m S  5.0  3.3   0:16.55 httpd
22123 apache    16   0  520m 118m  27m S 35.6  3.2   0:07.40 httpd
22143 apache    16   0  515m 106m  19m R 24.6  2.9   0:01.12 httpd
28124 root      15   0  176m  70m 6164 S  0.0  1.9   1:00.04 php
31934 root      16   0  176m  70m 6164 S  0.0  1.9   1:00.04 php
20213 root      16   0  176m  69m 6168 S  0.0  1.9   1:00.04 php
18022 root      17   0  176m  69m 6136 S  0.0  1.9   1:00.04 php
 3238 root      16   0  175m  69m 6136 S  0.0  1.9   1:00.04 php
21992 root      15   0  492m  69m 6548 S  0.0  1.9   0:01.03 httpd
10096 root      18   0  175m  69m 6148 S  0.0  1.9   1:00.04 php
 3371 root      16   0  175m  69m 6148 S  0.0  1.9   1:00.04 php
27819 memcache  15   0  133m  68m  560 S  0.0  1.8  10:28.44 memcached
26027 root      16   0  175m  66m 6148 S  0.0  1.8   1:00.04 php
11369 root      16   0  176m  63m 6136 S  0.0  1.7   1:00.05 php
22445 root      18   0  173m  55m 6060 S  0.0  1.5   1:00.04 php
21504 root      16   0  176m  45m 6136 S  0.0  1.2   1:00.04 php
 5852 root      17   0  208m  38m 5976 S  0.0  1.0   1:00.04 php
15600 root      16   0  144m  37m 5980 S  0.0  1.0   1:00.04 php
13967 root      16   0  144m  37m 5980 S  0.0  1.0   1:00.05 php
 1663 root      16   0  144m  37m 5984 S  0.0  1.0   1:00.04 php
18150 root      16   0  143m  37m 5980 S  0.0  1.0   1:00.04 php
 5594 root      15   0  143m  37m 5988 S  0.0  1.0   1:00.03 php
25752 root      15   0  207m  37m 5976 S  0.0  1.0   1:00.04 php
20251 root      16   0  143m  36m 5980 S  0.0  1.0   1:00.06 php
28102 root      15   0  208m  35m 5980 S  0.0  1.0   1:00.05 php
15875 root      16   0  175m  34m 6136 S  0.0  0.9   1:00.03 php
13634 root      16   0  207m  33m 5980 S  0.0  0.9   1:00.04 php
28239 root      16   0  208m  32m 5980 S  0.0  0.9   1:00.04 php
18298 root      16   0  207m  28m 5976 S  0.0  0.8   1:00.06 php
26227 root      17   0  175m  18m 6136 S  0.0  0.5   1:00.03 php
 5722 root      16   0  174m  18m 6148 S  0.0  0.5   1:00.04 php
22492 root      18   0  175m  13m 6136 S  0.0  0.4   1:00.04 php
24081 root      16   0  142m  11m 5980 S  0.0  0.3   1:00.03 php
 4033 root      16   0  175m  11m 6136 S  0.0  0.3   1:00.05 php
 3523 root      16   0  143m 9592 5976 S  0.0  0.3   1:00.03 php
16007 root      16   0  175m 6140 6136 S  0.0  0.2   1:00.05 php
16035 root      15   0  207m 6104 5980 S  0.0  0.2   1:00.03 php
12251 root      16   0  143m 5984 5980 S  0.0  0.2   1:00.03 php
15398 root      16   0  207m 5980 5976 S  0.0  0.2   1:00.03 php
25719 nobody    10  -5 24528 3000  780 S  0.0  0.1   0:28.34 nginx
25718 nobody    10  -5 24392 2840  780 S  0.0  0.1   0:26.12 nginx

Вот это огромное количество повисших процессов php, откуда они взялись и как их убивать автоматически?

UPD В общем, нужно было написать вопрос, чтобы понять, откуда они взялись. Это все повисшие задачи по крону. Вопрос тогда переформулируем так: что сделать, чтобы повисшие процессы php убивались по таймауту.

А как вы собираетесь определять что они «повисшие», если они имеют статус «zobie», то тогда модно поступить так:

ps -j ax | while read proc_str
do 
   echo "$proc_str" | awk '{ print $5 }' | grep -i Z > /dev/null && kill -9 `echo "$proc_str" | awk '{ print $1 }' ` 
done

Создайте скрипт и повесьте в крон с интервалом, к примеру, в минуту., так же можете повесить фильтр по вхождение «php».

kostik87 ★★★★★ ()

подключи похапэ через fcgi и он сам будет их убивать.

xpahos ★★★★★ ()

Не лучше ли вставить в скрипт логику запрещающую его запускать больше одного раза?

fjoe ()
Ответ на: комментарий от fjoe

Не лучше ли вставить в скрипт логику запрещающую его запускать больше одного раза?

что-то от вас травкой попахивает. Не наркоман ли вы?

xpahos ★★★★★ ()

OOM-killer сам всех убьет, когда посчитает нужным

Harald ★★★★★ ()

откуда они взялись

Очевидно, из-за быдлокода, из которого они состоят. Если бы они не висли, не было бы проблемы их убивать, а не будут виснуть они, если исправить ошибки.

gentoo_root ★★★★★ ()
Ответ на: комментарий от baverman

да, сорри. Я в конце невнимательно прочел.

xpahos ★★★★★ ()
Ответ на: комментарий от kostik87

Спасибо за скрипт. Процессы не zombie, они в статусе sleep, как я понимаю. Так просто не определить, нужен в данный момент этот процесс или его можно прибить.

Вот чего я не понимаю, это почему они не завершаются самостоятельно. В скрипте включены файлы CMS с помощью include(), где, видимо, переопределяется max_execution_time (в самом скрипте для крона max_execution_time увеличено с помощью set_time_limit()). В результате процессу просто не хватает времени отработать и он аварийно завершается. Я вот не понимаю, на каждый включенный файл свой процесс запускается, или почему первоначальный процесс не умирает?

alexparty ()

Писать грамотные программы?

r2d2 ()

Поправить php.ini, выставив таймут на исполнение

pekmop1024 ★★★★★ ()
Ответ на: комментарий от kostik87

В выводе top 8-я колонка — это и есть статус, если я не ошибаюсь.

BTW Прошло 20 часов, новых процессов нет. Я думаю, была какая-то ошибка, они наплодились и висели, пока я их не обнаружил:)

Что касается программировать лучше и поправить php.ini, это хорошие советы, спасибо.

alexparty ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.