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 );

問題は、このコマンドが、スーパーバイザーの制御下にある PHP スクリプト内からトリガーされた場合、何の影響もないように見えることです。なんで?

スーパーバイザー内で実行されているこのプロセス グループを開始し、コマンド ラインから直接スクリプトの別のインスタンスをトリガーすると、すべてのスーパーバイザー プロセスが停止します。

何が起こっている?デーモン化されたPHPスクリプトはexec()シェルコマンドではありませんか?

4

1 に答える 1

5

Supervisor のログ ファイルを確認したところ、「sorry, you must have a tty to run sudo.」というエラー メッセージが見つかりました。これは、Supervisor が PHP スクリプトをデーモン化したために発生していると考えられます。Linux のセキュリティのため、デーモン化されたプロセス内から sudo を使用してコマンドを呼び出すことは許可されていません。

解決策は、スーパーバイザーを現在のユーザーとして実行することでした。これは、私が行っていたように sudo コマンドで実行しない限り、デフォルトで実行されます ( sudo /usr/bin/supervisord)。私のスクリプトには実行に必要なすべてのアクセス権がなかったので、これを行っていました(プロセスをセットアップしたとき、私はずっと前に怠惰だったと思います)。

これを修正した後、sudo コマンド ( /usr/bin/supervidord) を使用せずに Supervisor を起動できるようになり、それを制御するために sudo を使用して Supervisorctl ( ) を実行する必要がなくなり/usr/bin/supervisorctl、デーモン化されたプロセスから sudo を呼び出すことができないという根本的な問題が解決されました。 .

于 2012-01-09T21:25:49.040 に答える