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 убивались по таймауту.



Последнее исправление: alexparty (всего исправлений: 1)

А как вы собираетесь определять что они «повисшие», если они имеют статус «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 ★★★★★
()

php под рутом? Это печально.

baverman ★★★
()

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
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.