“监督人”;退出状态1不应为“预期”;运行php脚本

“监督人”;退出状态1不应为“预期”;运行php脚本,php,supervisord,Php,Supervisord,我遇到了一个问题:如何配置管理器来运行php脚本。在调试模式下运行supervisor可提供以下信息: 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

我遇到了一个问题:如何配置管理器来运行php脚本。在调试模式下运行supervisor可提供以下信息:

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\u EOL

没有报告php错误的日志,如果我通过cli运行脚本,它将按预期工作。supervisord日志只报告与debuggin相同的输出

我也尝试过使用绝对路径,比如
/usr/bin/php/home/path/to/script/myScript.php
,但没有任何变化

myScript.php的文件权限设置为
-rwxr-x 1 root apache

我真的不知道还能查到什么。谢谢你的支持

更新_1

我还尝试监视其他程序,如/bin/cat或bash脚本,工作起来很有魅力。问题似乎仅限于php

更新_2

正如N.B.在评论中指出的,我已将测试脚本更改为更像长时间运行的作业:

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

和以前一样,它进入致命状态。

我已经使用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;
(i=0;i<10;i++)的

{
printf(“\n操作:%d”,$i);
usleep(1000*200);//每次printf之间间隔200毫秒
}
出口

并将其添加到监管中。它应该在回显后重新启动。

我可以用退出代码1重现此行为的唯一方法是使用无效的文件路径。因此,首先请仔细检查路径是否正确。但我认为你以前做过

我更假设该文件位于您的主目录下,并且根用户无法访问和运行它。所以我会尝试更改脚本的位置

为了进行测试,您可以将脚本放在
/tmp/myScript.php
下:

cp /home/path/to/script/myScript.php /tmp/myScript.php
并修改您的supervisord配置,如下所示:

[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更改为您的用户(我不建议这样做),或者将项目位置更改为另一个文件夹,该文件夹不位于您的主目录下。

尝试设置
startsecs=0

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

程序保持运行所需的总秒数 启动后考虑启动成功。如果程序有 在它启动后的这几秒钟内不要熬夜,即使 使用“预期”退出代码退出(请参阅exitcodes),启动将 被认为是失败的。设置为0表示程序不需要 在任何特定的时间内保持跑步


你在“worker1.err.log”里什么都没说?不,什么都没说。它甚至还没有被创建……您在“命令”行中尝试过脚本的完整路径吗?是的,尝试过像:/usr/bin/php/home/path/to/script/myScript.php那样运行它。没有区别。重定向\u stderr正在重定向到您的stdout,我认为您的stdout中也没有任何内容?尝试了此代码段,与while(true)循环的行为相同。谢谢你的帮助!您的解决方案有效,我刚刚将文件移动到tmp目录中!但是,即使我在原始位置下与我的用户一起运行supervisor,它也不起作用。我会设法把脚本移到主文件夹之外。。。谢谢你的帮助!这很有帮助,谢谢!我使用supervisor conf运行bash脚本(以避免路径问题),但同时缺少change user和change directory