2015年7月12日日曜日

"kill"コマンドでPHP-FPMをリロード


DockerのコンテナとしてPHP-FPMを起動している場合、"kill"コマンドで
PHP-FPMをリロードしたいことがあると思います。

やり方は簡単で
kill -USR2 プロセス番号(php-fpm: master process)
でOKです。

実際に試してみます。

PHP-FPMのプロセスはこんな感じです。
# docker exec 77586670e25f ps aux
root        86  0.0  1.2 298316 13192 ?        Ss   Jul10   0:06 php-fpm: master process (/etc/php-fpm.conf)
apache      90  0.0  0.5 298316  5604 ?        S    Jul10   0:00 php-fpm: pool www
apache      91  0.0  0.5 298316  5604 ?        S    Jul10   0:00 php-fpm: pool www
apache      92  0.0  0.5 298316  5604 ?        S    Jul10   0:00 php-fpm: pool www
apache      93  0.0  0.5 298316  5604 ?        S    Jul10   0:00 php-fpm: pool www
apache      94  0.0  0.5 298316  5604 ?        S    Jul10   0:00 php-fpm: pool www

PHP-FPM(php-fpm: master process)のプロセス(86番)を"kill -USR2"します。
# docker exec 77586670e25f kill -USR2 86

すると、次のようにPHP-FPM(php-fpm: pool)のプロセスIDが変更されてることがわかります。
# docker exec 77586670e25f ps aux
root        86  0.0  1.2 298316 13192 ?        Ss   Jul10   0:06 php-fpm: master process (/etc/php-fpm.conf)
apache     138  0.0  0.5 298316  5600 ?        S    02:20   0:00 php-fpm: pool www
apache     139  0.0  0.5 298316  5600 ?        S    02:20   0:00 php-fpm: pool www
apache     140  0.0  0.5 298316  5600 ?        S    02:20   0:00 php-fpm: pool www
apache     141  0.0  0.5 298316  5600 ?        S    02:20   0:00 php-fpm: pool www
apache     142  0.0  0.5 298316  5600 ?        S    02:20   0:00 php-fpm: pool www

PHPのモジュールの追加や設定変更を行った後に、上記を実行することで、
それらを反映することができます。

2015年6月28日日曜日

指定したユーザーで実行したプログラム(su - user -c program)のPIDファイルを作成する


もっとカッコイイ方法はあると思いますが、とりあえずこんな感じで...
# ./sleep.sh /var/run/sleep.pid

sleep.sh


まず、指定ユーザー(sleep)がプログラム(sleep 60)を実行した後に
"/tmp"下にPIDファイルを書き出しています。
(パーミッションの問題で直接"/var/run/"下に書き出せない)

そして、"root"で"/var/run/"下にPIDファイルを移動しています。

ポイントは、プロセスIDを取得する変数"$!"
をバックスラッシュでエスケープ(\$!)しているところでしょうか?

上記コマンド実行後、下記のように"sleep"ユーザーで実行されているのがわかり
# ps aux | grep sleep
sleep     2822  0.0  0.0 107888   620 ?        S    23:11   0:00 sleep 60
root      2825  0.0  0.0 110400   860 pts/0    S+   23:11   0:00 grep sleep
プロセスIDも問題なく書きだされていることが確認できます。
# cat /var/run/sleep.pid 
2822

Monitの状態("unmonitor"など)をリセットする


Monitで下記のように再起動の上限までいってしまい"unmonitor"の状態になってしまい、
それ以降、プロセスが監視されない状態になってしまったときの対策です。
[JST Jun 28 18:08:14] error    : 'sleep' service restarted 5 times within 5 cycles(s) - unmonitor
まあ普通はMonitのコマンドで実施すると思いますが、
# monit status
monit: error connecting to the monit daemon
のようなエラーが出てしまうことがあります。これはMonitのWebのインターフェースが
利用できない状態になってるためのエラーですが、基本的に使ってないので、
今さら有効にするのもどうかなー、と思い、別の方法を探してみました。

ってことで下記を実行することでリセットできます。
# service monit stop
# rm -f /root/.monit.state
# service monit start
※ "/root/.monit.state"はMonitの状態を記録するファイル(デフォルト)です。

すると、再度プロセスの監視が始まり、プロセスが落ちても起動してくれるようになります。