『Working with Unix Processes』の Processes Can Get Signals を読みました
はじめに
Zombie Processes の続きです。
この本は社内勉強会で読み進めているのですが、今回から進め方を少し変えました。今までは本文を逐次翻訳で読み進めていました。それだと勉強会の期間が長引きそうなので、今回からは予習を前提にしました。メンバーはみんな予習として本文を読んできます。当日の担当者は、章ごとにまとめの解説をしたり、コードを実行したり、質問が無いかを聞いたりするスタイルです。
本文や議論したことのまとめ
親プロセスで wait すると子プロセスを監視できる。だが wait で待ちが発生してしまう。待つ余裕がない忙しい親プロセスだったらどうするのか。それを解決するのがシグナルだ。
シグナルをトラップして処理を行える。ただし、同種のシグナルが同時に届くとロストしうる。すべてハンドルする方法は本文中のサンプルコードを参照。コード中でなぜ rescue が必要なのかというと、最後のシグナルが届いたときに直前のハンドラーが最後の取得可能なステータスを取得してしまった場合には Errno::ECHILD が発生するため(理解するのに時間かかった)。
シグナルを受け取ったときの処理は自由に再定義していいが、ユーザ定義用に準備されているシグナルは SIGUSR1 と SIGUSR2 である。SIGKILL や SIGSTOP はラスボスなのでトラップ・無視・再定義できない。trap に "IGNORE" を渡すと無視できる。
シグナルハンドラーはグローバルなので再定義するときは行儀よくやることが大事。ハンドラーを call するタイミングはコードによる。QUIT を trap するときに順序が大事なら at_exitブロックを使うことを検討するなど。
わからなかった単語
- caveat: 警告
- foray: 侵略, 「洗礼」と訳したほうが適切かも
- portion: 一部分
- taunt: からかう, 馬鹿にする
- trample: 踏みにじる
- wire up: つなぐ
シグナルは普段 Ctrl で送っていたアレである
普段プロセスを終了するとき Ctrl + C で終わらせることが多かったのですが、本文を読んで、Ctrl + C は SIGINT を送っていることと同じ書いてあって驚きました。
だったら Ctrl + Z は何だろうと思い調べてみたら、SIGSTOP を送っているそうです。たしかに Ctrl + Z するとプロセスが中断(STOP)します。
さらに、SIGQUIT を送るショートカットは無いのかなと調べていたら、ありました! それは Ctrl + \(バックスラッシュ)です。実際、Ctrl + C を送ってもきかないプロセスは Ctrl + \ で無理やり終了できました。使いどころに注意ですが便利です。
SIGHUP は SSH接続が切れた時に子プロセスへ送られるシグナル
そして SIGHUP を受け取った子プロセスを終わらせないのが nohupコマンドです。SIGHUP を無視します。何となく SIGHUP や nohup を聞いたことがあったのですが、ようやく頭のなかでつながりました。
SSH接続を切断したあとでもプロセスを継続させる方法はまさに! というドキュメントがあったのでリンクを載せます。SSH接続して重い処理を流したまま切断して家に帰れるようにするためのスキルですね。
感想
16ページとすごく大きな章で読みごたえがありました。ふだん何気なくつかっていたショートカットや Unicorn の再起動などでシグナルを送っていたのを知って驚きの連続でした。あ。そういうことか! と。
Unicorn のコードを少し読んでみたら、trap とか at_exit に色々処理が書かれていました。コードリーディングするためのスキルの高まりを感じます^^
おわりに
勉強会の進め方を変えたメリットとして、英文を読むのにさく時間が減り、進むページ数は 7ページ前後から 10ページ前後に増え、議論する時間がのびて良い感じの場になりました。勉強会までのオーバーヘッドは高くなりますが、メリットが沢山あってイイ!