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

T. *_*nes 1 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 );
Run Code Online (Sandbox Code Playgroud)

问题是,当在Supervisor的控制下从PHP脚本中触发时,此命令似乎没有任何影响.为什么?

如果我启动在Supervisor中运行的这组进程,然后直接从命令行触发另一个脚本实例,它就可以运行并且所有Supervisor进程都会停止.

到底是怎么回事?可以守护PHP脚本而不是exec()shell命令吗?

T. *_*nes 5

我检查了Supervisor的日志文件,发现错误消息"抱歉,你必须有一个tty才能运行sudo." 从我可以看出,这种情况正在发生,因为Supervisor已经守护了我的PHP脚本.由于Linux安全性,我不允许在守护进程中使用sudo调用命令.

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

修复此问题后,我可以在不使用sudo命令(/usr/bin/supervidord)的情况下启动Supervisor ,然后我不需要/usr/bin/supervisorctl用sudo 执行supervisorctl()来控制它,从而解决了无法从daeomonized进程调用sudo的根本问题.