ApacheのGraceful StopがSIGWINCHなのは何故か

More than 1 year has passed since last update.


背景

httpd.serviceの中を覗いたとき、execstopがkill -WINCHを呼んでいるのを見つけた。

一体なぜ SIGSTOPではなくSIGWINCHなのか気になった。

httpd-service.PNG


結論

仕様

だけど、なぜそういう仕様なのかは分からない。


環境


  • CentOS7.1.503

  • 3.10.0-229.el7.x86_64

  • vmware player


signalの調査

まずは、man 7 signalでSIGSTOPとSIGWINCHを見てみる。

sigstop.PNG

sigwinch.PNG



  • SIGWINCHはウィンドウリサイズを通知するシグナル


  • SIGWINCHはデフォルト動作が無視される。


  • SIGSTOPはデフォルト動作が停止。

他のプロセスウィンドウリサイズを通知すると止まるのか。(止まらないはずだけど念のため)

test2.gif


apache側の説明


The WINCH or graceful-stop signal causes the parent process to advise the children to exit after their current request (or to exit immediately if they're not serving anything).


残念ながら、なぜWINCHなのかの説明はなさそう。

Apach Doc: https://httpd.apache.org/docs/2.4/en/stopping.html


stack over flow

SOF先生に聞いてみるとこんな回答があった。


uh? if I remember correctly, SIGWINCH is a signal that get sent to a terminal application when the size of the terminal window changes (so that the application can resize itself). Typically used by ncurses applications.


なるほどncursesというアプリケーションの場合はそう言った挙動らしい。


apacheの処理をみる

gihubにあるhttpdの76行目と78行目で指定している。

commitを追ってみるとこのcommitの修正でSIGWINCHをrestartに割り当てている。(修正前はSIG_IGNなので無視されるようになっている。実装前だったから?)

その下の子プロセスが受け取った場合は何もしないけど親プロセスにgraceful restartする旨を伝えると書いてあります。

ncursesは関係ないみたいです。


SOF2


This as designed, see bz.apache.org/bugzilla/show_bug.cgi?id=50669


リンク先をみるとこう解説されています。


httpd normally runs detached from a terminal the SIGWINCH signal was chosen to instruct httpd to do a graceful shutdown. So this works as designed.


仕様!! らしいです。

仕様なら仕方ない...

なぜそういう仕様になったのかは分かりませんでした。ご存知の方がいらしたらご教授いただきたいです。

補足?

以前SIGWINCHを直接読んでたみたいですが、AP_SIG_GRACEFULに置き換わったみたいです