Supervisord «статус выхода 1 не ожидается» работает сценарий php

У меня проблема с настройкой супервизора для запуска php-скрипта. Запуск супервизора в режиме отладки дает мне следующее:

2015-03-09 08:53:06,342 INFO supervisord started with pid 2030 2015-03-09 08:53:06,358 INFO spawned: 'worker1' with pid 2031 2015-03-09 08:53:06,423 INFO exited: worker1 (exit status 1; not expected) 2015-03-09 08:53:06,424 INFO received SIGCLD indicating a child quit 2015-03-09 08:53:07,440 INFO spawned: 'worker1' with pid 2032 2015-03-09 08:53:07,587 INFO exited: worker1 (exit status 1; not expected) 2015-03-09 08:53:07,589 INFO received SIGCLD indicating a child quit 2015-03-09 08:53:09,604 INFO spawned: 'worker1' with pid 2033 2015-03-09 08:53:09,756 INFO exited: worker1 (exit status 1; not expected) 2015-03-09 08:53:09,758 INFO received SIGCLD indicating a child quit 2015-03-09 08:53:12,775 INFO spawned: 'worker1' with pid 2034 2015-03-09 08:53:12,973 INFO exited: worker1 (exit status 1; not expected) 2015-03-09 08:53:12,974 INFO received SIGCLD indicating a child quit 2015-03-09 08:53:13,976 INFO gave up: worker1 entered FATAL state, too many start retries too quickly 

Конфигурация супервизора:

 [program:worker1] command=php myScript.php directory=/home/path/to/script/ user=root autostart=true autorestart=true stderr_logfile=/var/log/worker1.err.log stdout_logfile=/var/log/worker1.out.log redirect_stderr=true environment=PATH="/usr/bin" 

Для этого теста myScript.php просто распечатывает echo "test".PHP_EOL;

Журналов, сообщающих об ошибках с php, нет, и если я запустил скрипт через cli, он работает так, как ожидалось. В журнале супервизора сообщается тот же вывод, что и debuggin.

Я также пытался использовать абсолютные пути, такие как /usr/bin/php /home/path/to/script/myScript.php но ничего не меняется.

Разрешение файла для myScript.php установлено на -rwxrwxr-x 1 root apache

На самом деле не знаю, что еще я мог проверить. Спасибо за поддержку!

UPDATE_1

Я также пытался контролировать другие программы, такие как / bin / cat или bash-скрипт и работает как шарм. Проблема, похоже, ограничена php.

UPDATE_2

Как отметил NB в комментариях, я изменил тестовый скрипт, чтобы больше походить на работу с длительным сроком работы:

 while(true){ echo "test".PHP_EOL; sleep(10); } в while(true){ echo "test".PHP_EOL; sleep(10); } 

Как и раньше, он входит в состояние FATAL.

    Единственный способ воспроизвести это поведение с кодом выхода 1 – использовать недопустимый путь к файлу. Поэтому сначала проверьте, правильно ли указан путь. Но я думаю, что ты сделал это раньше.

    Я предполагаю, что файл находится под вашим домашним каталогом, и пользователь root не может получить доступ и запустить его. Поэтому я попытаюсь изменить расположение сценария.

    Для тестирования вы можете разместить свой скрипт под /tmp/myScript.php :

     cp /home/path/to/script/myScript.php /tmp/myScript.php 

    и измените конфигурацию вашего супервизора следующим образом:

     [program:worker1] command=php myScript.php directory=/tmp/ user=root autostart=true autorestart=true stderr_logfile=/var/log/worker1.err.log stdout_logfile=/var/log/worker1.out.log redirect_stderr=true environment=PATH="/usr/bin" 

    Теперь надзорный надзор должен иметь возможность запускать ваш скрипт.

    Если это работает, вы должны проверить, в какой папке запрещается доступ root к скрипту. Это может быть вызвано зашифрованной (и установленной) папкой (home dir?), Или если местоположение установлено из другого места (samba, nfs …). Чтобы решить проблему, вы можете попытаться изменить пользователя от root к пользователю (я бы не рекомендовал этого) или изменить местоположение проекта в другой папке, которая не находится в вашем домашнем каталоге.

    Я использовал Supervisord некоторое время, и это то, что у меня есть в моей конфигурации:

     [program:worker1] command=php /absolute/path/to/myScript.php 

    Причина, по которой я пишу это как anwser, связана с форматированием.

    Также попробуйте этот скрипт:

     for(i = 0; i < 10; i++) { printf("\nIteration: %d", $i); usleep(1000 * 200); // 200 milliseconds between each printf } exit; 

    И добавьте его в надзор. Он должен быть перезапущен после его повторения.

    попробуйте установить startecs = 0:

     [program:foo] command = ls startsecs = 0 autorestart = false http://supervisord.org/configuration.html 

    startsecs

    Общее количество секунд, в течение которых программа должна оставаться включенной после запуска, чтобы считать начало успешным. Если программа не останавливается на протяжении многих секунд после ее запуска, даже если она выйдет с «ожидаемым» кодом выхода (см. Коды выхода), запуск будет считаться сбоем. Установите значение 0, чтобы указать, что программа не должна оставаться включенной в течение определенного периода времени.