Passengerでゾンビプロセスを殺す時のベストプラクティス

Passenger EnterpriseでRollingRestartを有効にしているとworkerプロセスがゾンビになって再起動してもプロセスが死なない時がある。

下記のケースではPID24388がtmp/restart.txtをtouchしても死なない状況である。

$  passenger-status
  Requests in queue: 0
  * PID: 24388   Sessions: 1       Processed: 9691    Uptime: 10h 36m 45s
    CPU: 3%      Memory  : 104M    Last used: 2s ago
  * PID: 14112   Sessions: 0       Processed: 1148    Uptime: 1h 17m 31s
    CPU: 3%      Memory  : 57M     Last used: 1m 0s ag
  * PID: 14121   Sessions: 0       Processed: 1327    Uptime: 1h 17m 30s
    CPU: 4%      Memory  : 57M     Last used: 1m 4s ag
  * PID: 14136   Sessions: 0       Processed: 1175    Uptime: 1h 17m 27s
    CPU: 3%      Memory  : 54M     Last used: 3s ago
  * PID: 14159   Sessions: 0       Processed: 1219    Uptime: 1h 17m 23s
    CPU: 3%      Memory  : 54M     Last used: 58s ago
  * PID: 14185   Sessions: 0       Processed: 945     Uptime: 1h 17m 20s
    CPU: 2%      Memory  : 53M     Last used: 5s ago

こういう場合まず最初に思いつくのがkillコマンドを使う事だがその場合運悪くそのプロセスと通信していたクライアントにはエラーを返してしまう。Passenger-4.0.37以上のバージョンを使っているならpassenger-config detach-processコマンドが使えるのでこちらを使うべきだ。

Phusion Passenger 4.0.37 released – Phusion Corporate BlogPhusion Corporate Blog

$ passenger-config detach-process 24388
Process 24388 detached.

問題なくゾンビプロセスは消えてなくなります。

$  passenger-status
  Requests in queue: 0
  * PID: 14112   Sessions: 0       Processed: 1148    Uptime: 1h 17m 33s
    CPU: 3%      Memory  : 57M     Last used: 1m 0s ag
  * PID: 14121   Sessions: 0       Processed: 1327    Uptime: 1h 17m 32s
    CPU: 4%      Memory  : 57M     Last used: 1m 4s ag
  * PID: 14136   Sessions: 0       Processed: 1175    Uptime: 1h 17m 29s
    CPU: 3%      Memory  : 54M     Last used: 3s ago
  * PID: 14159   Sessions: 0       Processed: 1219    Uptime: 1h 17m 25s
    CPU: 3%      Memory  : 54M     Last used: 58s ago
  * PID: 14185   Sessions: 0       Processed: 945     Uptime: 1h 17m 22s
    CPU: 2%      Memory  : 53M     Last used: 5s ago