我正在使用Supervisor并行化一个PHP脚本。当我的脚本从数据库中获得某个响应时,它会执行一个命令,停止Supervisord守护进程使用supervisorctl
控制的所有进程。这是命令:
// gracefully stop all processes in supervisor's group called processes
$cmd = 'sudo /usr/bin/supervisorctl stop processes:*';
exec( $cmd, $outputs );
问题是,当从Supervisor控制下的PHP脚本中触发时,该命令似乎没有影响。为什么?
如果我启动这组在Supervisor中运行的进程,然后直接从命令行触发脚本的另一个实例,它就会工作,所有Supervisor进程都会停止。
发生了什么事?守护程序化的PHP脚本不能是exec()
shell命令吗?
我检查了Supervisor的日志文件,发现错误消息"对不起,你必须有一个tty才能运行sudo。"据我所知,之所以会发生这种情况,是因为Supervisor已经守护了我的PHP脚本。由于Linux的安全性,我不允许在守护进程中使用sudo调用命令。
解决方案是以当前用户的身份运行Supervisor,这在默认情况下是这样做的,除非您像我一直在做的那样使用sudo命令执行它(sudo /usr/bin/supervisord
)。我这么做是因为我的脚本没有运行所需的所有访问权限(我想我很久以前在设置流程时就很懒了)。
修复后,我可以在不使用sudo命令(/usr/bin/supervidord
)的情况下启动Supervisor,然后我不需要用sudo执行supervisorctl(/usr/bin/supervisorctl
)来控制它,从而解决了无法从daeomonized进程调用sudo的根本问题。