最近忽然好奇 Linux 下 Apache httpd CGI 的一些 Signal 相關的事情。 特此紀錄一些資訊.
以下的測試結果來自 docker hub 的 apache httpd:2.4.59
被 Block 的訊號
在 CGI 剛啟動時,會直接繼承 httpd 所 Block 的訊號. 根據使用的 mpm (multiple-process-module) 不同,被 Block 的訊號也不同| event | prefork | worker | SigBlk | fffffffe3ffbea07 | 0000000000000000 | fffffffe3ffbe807 |
|---|
1 SIGHUP: 1 2 SIGINT: 1 3 SIGQUIT: 1 4 SIGILL: 0 5 SIGTRAP: 0 6 SIGABRT: 0 6 SIGIOT: 0 7 SIGBUS: 0 8 SIGFPE: 0 9 SIGKILL: 0 10 SIGUSR1: 1 11 SIGSEGV: 0 12 SIGUSR2: 1 13 SIGPIPE: 0 14 SIGALRM: 1 15 SIGTERM: 1 16 SIGSTKFLT: 1 17 SIGCHLD: 1 17 SIGCLD: 1 18 SIGCONT: 1 19 SIGSTOP: 0 20 SIGTSTP: 1 21 SIGTTIN: 1 22 SIGTTOU: 1 23 SIGURG: 1 24 SIGXCPU: 1 25 SIGXFSZ: 1 26 SIGVTALRM: 1 27 SIGPROF: 1 28 SIGWINCH: 1 29 SIGIO: 1 29 SIGPOLL: 1 30 SIGPWR: 1 31 SIGSYS: 0 34 SIGRTMIN: 1當 CGI 有想要控制 signal 會 fork 出 daemon 之類時,最好對整個 signal 進行一次重設會比較保險
若 Apache Gateway Timeout
三種 mpm module 結果一致- CGI Process 會立即收到 SIGTERM
- CGI Process 數秒(測試 3 秒)後收到 SIGKILL
- SIGTERM 與 SIGKILL 不發送給 CGI 另外 fork 的 process
若 HTTP Client 切斷連線的話
三種 mpm module 結果一致- 切斷連線後有對 stdout 發送訊息的情況下
- 數杪後(測試 3 秒)會收到 SIGTERM
- 收到 SIGTERM 後如果對 stdout 繼續發送訊息,會收到 SIGPIPE
- 數杪後(測試 3 秒)會收到 SIGKILL
- 切斷連線後沒對 stdout 發送訊息的情況下,以 Gateway Timeout 的方式處理
- SIGTERM 與 SIGKILL 不發送給 CGI 另外 fork 的 process






