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スクリプトが完成しました。