2011-01-06 5 views
1

Я хотел бы иметь оболочку scipt, которая выполняется бесконечно и продолжает проверять статус php-скрипта (скажем, my.php) и перезапускает его, если скрипт каким-то образом завершился. У меня есть идея поехать -сценарий оболочки для проверки статуса другого скрипта и перезапуска его

ps -aux | grep "my.php" 

и затем использовать результат этого, чтобы проверить статус и сделать соответственно. Заранее спасибо.

+1

если ваша система имеет 'pgrep', это намного проще в использовании. –

ответ

3

Вы можете просто сказать:

ps -aux | grep -q "my.php" || php -f my.php 

Как это работает в том, что grep -q не выводится ничего, но возвращает «OK» код завершения, если он нашел что-то. когда он возвращает код выхода «НЕ ОК», часть после завершения || («или») (из-за булевой оценки короткого замыкания - поиск).

Кроме того, необходимо убедиться, что:

  1. запустить новый скрипт в фоновом режиме и снимите его с консоли, так что ваш сценарий может продолжать контролировать

  2. при запуске ps | grep иногда ps также перечисляет ваш grep, а затем grep «greps», поэтому вам нужно отфильтровать это.

Это должно выглядеть примерно так:

while true 
    ps -aux | grep -v grep | grep -q "my.php" || (nohup php -f "my.php" &) 
    sleep 1 
done 

или некоторые, такие ..

+0

Что делать, если ps -aux перечисляет «my.php», но с T-статусом. ???? – ayush

+0

«T» означает, что кто-то отправил ему сигнал -STOP - это обычно происходит специально: сценарий был приостановлен в фоновом режиме или отлаживается. Вы не хотите идти и начинать второй процесс, когда это происходит, потому что сценарий может продолжаться в одно мгновение. – Guss

1

Другой подход, начните PHP-программы в цикле:

for ((;;)) 
do 
    my.php 
done 

С Linux ps вы можете использовать

ps -C "my.php" 

вместо grep, чтобы идентифицировать my.php. Команды Grep часто оказываются. Может быть, у вашего ps есть аналогичный переключатель?

+0

Я не знаю, какую операционную систему вы используете, но в моей, -C is * «Измените процент процентного процента процессора, используя« исходный »расчет ЦП, который игнорирует« резидентное время »*. Если вопрос OP о PHP и Shell, ответьте на вопрос с точки зрения PHP и оболочки, а не ваш особый вкус какой-либо другой команды. – ghoti

+0

Я использую Linux, и manpage ps говорит: «Этот ps соответствует: 1) Версия 2 Спецификации Single Unix, 2) Технические спецификации базового базового стандарта Open Group, выпуск 6, 3) IEEE Std 1003.1, 2004 Издание, 4) Расширение X/Open System Interfaces Extension [UP XSI], 5) ISO/IEC 9945: 2003' - Я думал, этого достаточно. –

+1

Все, что мы знаем из вопроса, состоит в том, что операционная система OP использует варианты стиля в стиле Berckley для 'ps', а не для параметров SystemV. – ghoti

1

Если вы действительно чувствуете необходимость в grep-выходе ps, остерегайтесь того, что ваш grep найдет себя.

[[email protected] ~]$ sleep 60 & 
[1] 66677 
[[email protected] ~]$ ps aux | grep sleep 
ghoti  66677 0.0 0.0 3928 784 11 S  4:11PM  0:00.00 sleep 60 
ghoti  66681 0.0 0.0 16440 1348 11 S+ 4:12PM  0:00.00 grep sleep 
[[email protected] ~]$ 

Существует простой способ избежать этого. Просто сделайте часть своего grep более сложным регулярным выражением.

[[email protected] ~]$ sleep 60 & 
[2] 66717 
[[email protected] ~]$ ps aux | grep '[s]leep' 
ghoti  66677 0.0 0.0 3928 784 11 S  4:11PM  0:00.00 sleep 60 
ghoti  66717 0.0 0.0 3928 784 11 S  4:13PM  0:00.00 sleep 60 
[[email protected] ~]$ 

С другой стороны, если вы просто хотите, чтобы убедиться, что ваш PHP скрипт всегда работает, вы можете обернуть его в чем-то, что повторно запускает его, когда он умирает:

while true; do 
    php /path/to/my.php 
done 

Если вы хочу, чтобы запустить при запуске, вы можете редактировать кронтаб на сервере, а также использовать @reboot тег, предполагая, что вы используете «Vixie» хроны (общие на Linux и BSD):

@reboot /path/to/wrapperscript 

вы можете man crontab и man 5 crontab для получения дополнительной информации о том, как использовать cron и тег @reboot.

Смежные вопросы