我有问题尝试配置supervisor来运行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
Run Code Online (Sandbox Code Playgroud)
supervisord配置:
[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"
Run Code Online (Sandbox Code Playgroud)
对于此测试,myScript.php只是打印出来 echo "test".PHP_EOL;
没有日志从php报告错误,如果我通过cli运行脚本它按预期工作.supervisord日志只报告与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);
}
Run Code Online (Sandbox Code Playgroud)
与之前相同,它进入FATAL状态.
skr*_*zek 13
我可以使用退出代码1重现此行为的唯一方法是使用文件的无效路径.所以首先请仔细检查路径是否正确.但我认为你以前做过这件事.
我更假设该文件位于您的主目录下,并且root用户无法访问并运行它.所以我会尝试更改脚本的位置.
要进行测试,您可以将脚本放在/tmp/myScript.php:
cp /home/path/to/script/myScript.php /tmp/myScript.php
Run Code Online (Sandbox Code Playgroud)
并修改你的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"
Run Code Online (Sandbox Code Playgroud)
现在监督应该能够运行你的脚本.
如果这样做,您应该检查哪个文件夹阻止root访问脚本.这可能是由encypted(和挂载)文件夹(home dir?)引起的,或者是从其他地方(samba,nfs ...)挂载的位置引起的.要解决此问题,您可以尝试将用户从root更改为用户(我不建议这样做)或将项目位置更改为另一个文件夹,该文件夹不在您的主目录下.