1

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

4

1 回答 1

5

我检查了 Supervisor 的日志文件,发现错误消息“对不起,您必须有一个 tty 才能运行 sudo。” 据我所知,这是因为 Supervisor 已经守护了我的 PHP 脚本。由于 Linux 的安全性,我不允许在守护进程中使用 sudo 调用命令。

解决方案是以当前用户身份运行 Supervisor,默认情况下会这样做,除非您像我一直在做的那样使用 sudo 命令执行它(sudo /usr/bin/supervisord)。我这样做是因为我的脚本没有运行所需的所有访问权限(我想我很久以前在设置进程时很懒惰)。

修复此问题后,我可以/usr/bin/supervidord不使用 sudo 命令(/usr/bin/supervisorctl.

于 2012-01-09T21:25:49.040 回答