перезапустите php-скрипт с помощью shell-скрипта - PullRequest
1 голос
/ 24 января 2011

Я использую скрипт для наблюдения за работой PHP-скрипта. Моя цель состоит в том, чтобы этот php-скрипт не спал / не завершался и всегда должен быть запущен. Код, который я использовал -

ps aux | grep -v grep | grep -q $file || ( nohup php -f $file -print > /var/log/file.log & ) 

теперь эта идея не будет работать для случаев, когда скрипт php был прерван (код состояния процесса T). Любая идея справиться с этим делом. могут ли такие процессы быть навсегда уничтожены, а затем перезапущены.

Ответы [ 2 ]

2 голосов
/ 24 января 2011

Как насчет просто перезапустить интерпретатор php, когда он умрет?

while true ; do php -f $file -print >> /var/log/file.log ; done

Конечно, кто-то может отправить сценарий SIGSTOP, SIGTSTP, SIGTTIN, SIGTTOU, чтобы он завис, но, возможно, у этого человека есть действительно веская причина. Вы можете заблокировать их все, кроме SIGSTOP, так что, возможно, все в порядке.

Или, если скрипт выполняет что-то вроде вызова read(2) на устройстве или сокете, которые никогда не вернутся, это на самом деле не обеспечит «жизнеспособность» вашего скрипта. (Но тогда вы бы использовали неблокирующий ввод-вывод для предотвращения этой ситуации, так что это покрыто.)

О, да, вы также можете вставить его в ваш / etc / inittab. Но я не дам вам больше намека на это, потому что я думаю, что это, вероятно, плохая идея.

И уже существует много подобных инструментов: daemontools и Linux Heartbeat - первые два, которые приходят на ум.

1 голос
/ 06 августа 2011

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

#!/bin/bash
# runScript.sh - keep a php script running
php -q -f ./cli-script.php -- $@
exec $0 $@;

exec $0 повторно запускает сценарий оболочки с параметрами, которые ему были заданы.

Для запуска в фоновом режиме вы можете nohup runScript.sh или запустить его с помощью скриптов init.d, upstart, runit или supervisord, среди прочих.

...