如何从主管管理的PHP脚本中停止Supervisor进程(过程控制系统)?

时间:2012-01-09 21:06:46

标签: php exec supervisord

我正在使用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命令吗?

1 个答案:

答案 0 :(得分:5)

我检查了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的根本问题。