У меня проблема, попробуйте настроить супервизор для запуска 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, и если я запускаю скрипт через клик, он работает как положено. Журнал супервизора просто сообщает тот же вывод, что и отладчик.
Я также пытался использовать абсолютные пути, такие как /usr/bin/php /home/path/to/script/myScript.php
но ничего не меняется.
Разрешение файла для myScript.php установлено на -rwxrwxr-x 1 root apache
На самом деле не знаю, что еще я мог бы проверить. Спасибо за помощь!
UPDATE_1
Я также пытался отслеживать другие программы, такие как / bin / cat или bash-скрипт, и работает как шарм. Проблема, кажется, ограничена php.
UPDATE_2
Как Н.Б. в комментариях я указал, что я изменил тестовый скрипт, чтобы он выглядел как долго выполняемая работа:
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
Причина, по которой я пишу это как ответ, связана с форматированием.
Также попробуйте этот скрипт:
for(i = 0; i < 10; i++)
{
printf("\nIteration: %d", $i);
usleep(1000 * 200); // 200 milliseconds between each printf
}
exit;
И добавь это в наблюдение. Это должно быть перезапущено после того, как это делает свое эхо.
Попробуйте установить startsecs = 0
:
[program:foo]
command = ls
startsecs = 0
autorestart = false
http://supervisord.org/configuration.html
startsecs
Общее количество секунд, необходимое программе для продолжения работы
после запуска, чтобы считать запуск успешным. Если программа делает
не спать в течение многих секунд после его начала, даже если он
выход с «ожидаемым» кодом выхода (см. коды выхода), запуск будет
считаться неудачей. Установите 0, чтобы указать, что программе не нужно
продолжайте работать в течение определенного времени.