如何从Supervisor正在管理的PHP脚本中停止Supervisor进程(一个进程控制系统)


How can I stop Supervisor processes ( a process control system ) from within a PHP script Supervisor is managing?

我正在使用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的根本问题。