2012-01-09 6 views
1

Supervisorを使用してPHPスクリプトを並列化しています。私のスクリプトは、データベースから一定の応答を受け取ると、supervisorctlを使用してSupervisordデーモンによって制御されているすべてのプロセスを停止するコマンドを実行します。ここでのコマンドは次のとおりです。スーパースクリプトが管理しているPHPスクリプト内からスーパーバイザプロセス(プロセス制御システム)を停止する方法を教えてください。

// gracefully stop all processes in supervisor's group called processes 
$cmd = 'sudo /usr/bin/supervisorctl stop processes:*'; 
exec($cmd, $outputs); 

問題は、このコマンドは、スーパーバイザーの制御下にあるPHPスクリプト内からトリガされたときに無影響しているようだということです。どうして?

スーパーバイザ内で実行されているこのプロセスグループを起動し、コマンドラインから別のインスタンスのスクリプトを起動すると、それは機能し、すべてのスーパーバイザプロセスは停止します。

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

答えて

4

スーパーバイザのログファイルを調べたところ、「sudoを実行するにはttyが必要です」というエラーメッセージが表示されました。私が想像できるところからは、SupervisorがPHPスクリプトをデーモン化しているため、これが起こっています。 Linuxのセキュリティのため、私はデーモンプロセス内からsudoコマンドを呼び出すことはできません。

解決策は、私が行っていたように(sudo /usr/bin/supervisord)sudoコマンドで実行しない限り、現在のユーザーとしてSupervisorを実行することでした。スクリプトは実行するために必要なすべてのアクセス権を持っていなかったので、私はこれをやっていました(私は自分のプロセスをセットアップするとずっと前に怠けていたと思います)。

これを固定した後、私はsudoコマンド(/usr/bin/supervidord)を使用せずにスーパーバイザーを開始することができ、その後、私は、このようにできないの根本的な問題を解決し、それを制御するために、sudoでsupervisorctl(/usr/bin/supervisorctl)を実行する必要はありませんでしたdaeomonizedプロセスからsudoを呼び出します。

関連する問題