aramsanのブログ

八方塞がりの年にあえて挑戦し始めるエンジニアリングブログ

plenv + cpanm + cartonな環境で、daemontoolsでハマった

plenv + cpanm + cartonな環境で、crontabでハマった - aramsanのブログ

にて、crontabから、plenv + cpanm + cartonな環境で動かした記事を書き、その文中で、daemontoolsからの起動もそのまま動くと書きました。

 

確かに、一見そのまま動いていました。

 

しかし、サービス化したスクリプトを止めたり動かしたりしていると、次第にレスポンスが悪くなっていき、最後はmysql が too many connectionsのエラーを吐き始めました。

 

そこで、プロセスを確認してみると、動かしたサービス x 再起動数のプロセスができているじゃないですか。一見うまく動いているように見えて、止まることができなくなっていたのです。

 

よくよく、挙動を見てみると、kickしているスクリプトはちゃんと再起動しているが、kickされているスクリプトがみるみるプロセスとして増えていく。

 

このkickスクリプトが、悪さをしていることに気づきました。

 

親プロセスが再起動されても、子プロセスが再起動されないことヒントに、調べてみると、execの有無で挙動が変わることに気づきました。

 

問題が起こるスクリプト

(前略)

carton /home/plenv/exec -- "$1"

問題が起きないスクリプト

(前略)

exec /home/plenv/carton exec -- "$1" 

 execは、子プロセスを作るのではなく、同一プロセスとして、実行するコマンドです。なので、親スクリプトが止められたら、自動的にその先のスクリプトも止められます。

 

これで、問題が解決しました。

 

出来上がった、kickスクリプトを以下に書いておきます。

#!/bin/sh

export HOME=/home/plenv

export PATH="$HOME/.plenv/bin:$PATH"

eval "$(plenv init -)"

cd $HOME

exec carton exec -- "$1" 

 これで、無事daemontoolsからもcrontabからも起動できる、kickスクリプトが完成しました。