0

私はPHP開発者であり、シェルスクリプトについてはほとんど知りません...ですから、ここで助けていただければ幸いです。

サーバーのバックグラウンドで実行する必要がある4つのphpスクリプトがあります。私はそれらをうまく起動することができます-それらはうまく機能します-そして私はそれらのPIDを調べることによってそれらを殺すことができます。

問題は、スクリプトが時々プロセスを強制終了して再起動する必要があることです。これは、プロセスが長期間のHTTP要求を維持し、場合によっては反対側で終了するためです。

しかし、PIDを手動で検索せずに、これらのプロセスを見つけて強制終了するコマンドを作成する方法がわかりません。

1つの起動コマンドから始めます:

/usr/local/php5/bin/php -f /home/path/to/php_script.php > /dev/null &

PIDを「割り当てる」方法はありますか?それで常に同じになりますか?またはプロセスに名前を付けますか?そして、どうすればその新しいコマンドを書くことができますか?

ありがとうございました!

4

5 に答える 5

4

いいえ、プロセスPIDを「割り当てる」ことはできません。代わりに、「実際の」デーモンと同じように実行する必要があります。スクリプトに独自のPIDをファイルに保存させ、強制終了する必要があるときにそのファイルから読み取ります。

別の方法は、スーパーバイザーのようなものを使用することです。これは、これらすべてを非常に優れた方法で処理します。

更新-スーパーバイザー構成

スーパーバイザーについて言及したので、ここに、その仕事をするための短いスーパーバイザー構成ファイルも投稿します。

[program:yourscriptname]
command=/usr/local/php5/bin/php -f /home/path/to/php_script.php

その他の構成オプションについては、こちらをご覧ください

次に、次のように使用できます。

# supervisorctl status

プロセスのステータスを表示します。

# supervisorctl start yourscriptname

スクリプトを開始するには

# supervisorctl stop yourscriptname

スクリプトを停止します

更新-実際のスーパーバイザー構成例

まず第一に、あなたがあなたの中にこれを持っていることを確認してください/etc/supervisor/supervisord.conf

[include]
files = /etc/supervisor/conf.d/*.conf

そうでない場合は、これらの2行を追加して

mkdir /etc/supervisor/conf.d/

次に、起動するプロセスごとに構成ファイルを作成します。

/etc/supervisor/conf.d/script1.conf

[program:script1]
command=/usr/local/php5/bin/php -f /home/path/to/php_script.php
stdout_logfile=/var/log/script1.log
stderr_logfile=/var/log/script1-error.log

/etc/supervisor/conf.d/script2.conf

[program:script2]
command=/usr/local/php5/bin/php -f /home/path/to/php_script2.php
stdout_logfile=/var/log/script2.log
stderr_logfile=/var/log/script2-error.log

...など。すべてのスクリプトに対して。

(トレーリングは必要ありません。スーパーバイザーがすべてのデーモン化を処理するため、実際には、スーパーバイザー内で自己デーモン化するプログラムを実行しないでください)。

次に、すべてを次のように開始できます。

supervisorctl start all

または、次のようなものを1つだけ使用します。

supervisorctl start script1

PHPからスーパーバイザーを開始

もちろん、スクリプト内からでも、上記の2つのコマンドを使用して、スーパーバイザーが制御するプロセスを開始/停止できます。

ただし、root権限が必要になることを忘れないでください。たとえば、許可するのは非常に危険です。サーバー上でrootとしてコマンドを実行するためのWebページ。

その場合は、スーパーバイザーを通常のユーザーとして実行する方法の説明を参照することをお勧めします(私はこれを行ったことはありませんが、www-dataユーザーとしても実行できるはずです)。

于 2012-10-17T22:14:21.460 に答える
3

これを解決する標準的な方法は、プロセスに既知の場所にあるファイルにPIDを書き込ませることです。これにより、ユーティリティスクリプトでファイルを検索し、PIDを読み取り、そのプロセスを操作できます。書き込むPIDファイルの名前を指定するコマンドライン引数をスクリプトに追加します。

于 2012-10-17T22:13:12.677 に答える
0

これを回避するにはps aux、を使用します。これにより、すべてのプロセスが、それらを呼び出したコマンドで表示されます。もちろん、これは4つのスクリプトが異なるファイルであるか、それらを呼び出したコマンドによって一意に識別できることを前提としています。それをgrepにパイプすると、すべて設定されますps aux | grep runningscript.php

于 2012-10-17T22:17:59.087 に答える
0

わかった!したがって、これは、スクリプトが何であれ、シェル/bashについて何も知らない私の頭痛の種でした...

@redShadowの応答は完璧でしたが、ホスティングプロバイダーが/ etc/supervisor/ディレクトリへのアクセスを許可しない場合を除きます。彼が言ったように、あなたはルートでなければなりません-そしてsudo、管理者であったとしても、私はそこでチャンスを作ることができませんでした...

これが私が思いついたものです:

kill -9 `ps -ef | grep php | grep -v grep | awk '{print $2}'`

topこのコマンドはphp実行中のプロセスをループし、phpコマンドとそれに対応するPIDを見つけてそれらを強制終了するため、実行していたコマンドのタイプのみがコマンドに表示されたためです。woot !!

于 2012-10-18T22:24:17.937 に答える
0

私がしていることは、「ru​​n.txt」という名前のファイルをスクリプトでチェックすることです。存在しない場合は終了します。次に、その(空の)ファイルの名前を変更するだけで、すべてのスクリプトを停止できます。

于 2013-01-12T11:19:25.773 に答える