LINUX.ORG.RU
ФорумAdmin

Не падающий php скрипт


0

1

Привет,

Есть скрипт на php который слушает в режиме реального времени пакеты с AMI астериска. Необходимо что бы в случае падения этого скрипта он запускался вновь, в случае если он зависает или что то тип того перезапускался. Как можно такое сделать? Куда копать?

>Необходимо что бы в случае падения этого скрипта он запускался вновь

Поставить в цикл на bash'е. Или поставить «слушателя» у чего-нить типа Gearman'а и из него пускать форк — если форк и умрёт, то это будет только проблема форка, а основной цикл будет ждать уже следующих данных.

в случае если он зависает или что то тип того перезапускался

Во втором варианте не обязательно, в первом — скажем, из основного цикла делать touch на файл-метку, и другим скриптом в цикле проверять. Если файл не обновлялся N времени — убивать PHP-скрипт (дальше он вываливается в вызвавший bash-цикл и запускается новым циклом)

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

Спасибо, буду перечитывать ваш пост и думать :)

temp001
() автор топика
Ответ на: комментарий от zolden

Проверка даже раз в минуту критична, необходимо что бы все это происходило моментально поэтому крон не канает

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

тогда как посоветовали выше - баш скрипт. Пятисекундную точность в обнаружении падения я думаю получить не составит труда. Плюс если правильно организовать треды(форкать скрипт), все будет еще лучше

Pinkbyte ★★★★★
()

вроде как лайти умеет каким-то хитрый и мне пока непонятным образом определять помер ли fcgi-слушатель и перезапускать его

anonymous
()

Необходимо что бы в случае падения этого скрипта он запускался вновь

Так запустите его в цикле и проверяйте код возрата. Если не 0, то цикл продолжается - команда снова выполняется.

Advanced Bash-scripting guide: Exit and exit status

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

И, скорее всего, модифицировать существующий скрипт на php, чтобы от как-то сообщал своё состояние. Формулировка:

в случае если он зависает или что то тип того перезапускался.

настораживает свой нечёткостью.

mky ★★★★★
()

Посмотри, как устроены init-скрипты в твоем дистре. Напиши свой по аналогии.

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

>в случае если он зависает или что то тип того перезапускался.

это я к тому что если попрет большой поток данных он захлебнется. Ну так мне обьяснил это программист этот скрипт писавший. Вообще можно ли средствами php отслеживать состояние процесса? Может программисту стоит внедрить в свой скрипт нечто вроде этого? Если есть то как это называется?

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

php знаю слабо, и, наверное, это лучше спрашивать в development. Вариант, предложенный KRoN73, с touch файла кажется вполне здравым.

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

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

ну возможно он не справится и ему станет плохо отчего он перестанет нормально фунциклировать но при этом не упадет

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

Если есть то как это называется?

обработка сигналов это называется. Только не все сигналы ловятся. Проще сделать цикл на баше. А лучше вообще отказаться от PHP.

xpahos ★★★★★
()
Ответ на: комментарий от KRoN73
#!/bin/bash

if [ "$(( $(date +"%s") - $(stat -c "%Y" tfile) ))" -gt "10" ]; then 
    echo "File don't touche longer then 10 sec!" 
	declare -i x=`pidof php`;
	echo "$x";
	if [$x]; then
		echo "Killing php script";
		kill -9 `pidof php`
		echo "Starting new php script";
		php script.php
		else
			echo "Just start php script";
			php script.php
		fi
fi 

Наваял такое, вопрос первый, первое условие выполняется, если делаю touch то в течении 10 секунд запуск скрипта ничего не дает, а вот по прошествии 10 сек почему то всегда перескакивает в точку «Just start php script» хотя в системе присутствует процесс php и по логике программы он должен его кильнуть. Вопрос второй, как зациклить скрипт что бы он выполнялся в бесконечном циле но с задержкой естественно.

temp001
() автор топика
Ответ на: комментарий от temp001
#!/bin/bash
while true
do
	if [ "$(( $(date +"%s") - $(stat -c "%Y" tfile) ))" -gt "10" ]; then 
		echo "File don't touche longer then 10 sec!!!!" 
		declare -i x=`pidof php`;
		echo "$x";
		echo "Killing php script";
		kill -9 `pidof php`
		echo "Starting new php script";
		php script.php
		sleep 1
fi 
done

Сделал так, но предыдущий вопрос остался, все таки интересно как в баше организовать проверку через if. По этому коду такой вопрос, когда условие все таки выполняется и начинают исполняться инструкции после then то когда доходит до php script.php на нем и остается, поскольку начинает выполнение но не заканчивает. Как сделать что бы php запустилось но потом продолжило дальше идти по циклу

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