はじめに
皆さんはプロセスについてどれくらい知っていますか?
業務で耳にすることはあっても、その実態が掴めずにいる方もいるのではないでしょうか?
私は2020年の4月に異業種からエンジニアへ転職して約4年ほどバックエンド開発に携わってきました。その中で、「プロセス」、「PID」、「プリフォーク」などのキーワードを耳にしましたが、雰囲気で理解している程度でした。
そんな時、PHPerKaigi2024で「サーバーとは何かを理解して、コンテナ1つで実行しよう」と言う登壇を拝見し、「プロセス?スレッド?よくわかんねぇけどもっと知りたい!」と思いました。そして、プロセスの解像度を上げる為に学習を決意しました。
その後、良い本を探していたところ「なるほどUnixプロセス ― Rubyで学ぶUnixの基礎」という本に出会いました。読んでみると他の人にもお勧めしたいと感じる本だったので、学んだことの一部を紹介し、プロセスの理解を深める手助けになればと思います。
実際に動かして試してみる
docker run --rm --name ruby -it ruby /bin/bash
rubyのコンテナを立てて、bashを起動します。
irb
irb
はInteractive Ruby
の略で、ターミナル上でRubyを1行ずつ実行できるようになります.
puts Process.pid
このコマンドでプロセスID(PID)を出力します。あとで確認するために、このPIDを覚えておいてください。
次に、別のタブや別ウインドウで同じrubyコンテナにアタッチしてみましょう。
docker exec -it ruby bash
アタッチしたら、現在のプロセスを表示してみます。
ps -A
PID TTY TIME CMD
1 pts/0 00:00:00 bash
7 pts/0 00:00:00 irb
9 pts/1 00:00:00 bash
394 pts/1 00:00:00 ps
irb
がPID7で動いており、puts Process.pid
で出力されたPIDと一致することが確認できます。
まとめ
手順は簡単でしたね。このように、実際に動かしてみることで「こうなるんだ」という感覚を掴みつつプロセスへの理解を深めることができます。全てを完全に理解したわけではありませんが、この本を通じてプロセスというものの解像度が上がったと感じています。
「プロセスよくわかんないけど理解りてぇ〜」という人には非常にお勧めできる本です。興味を持った方はぜひ読んでみてください。
ちなみに以下のようなことが学べると書いてあります。
どれか一つでも当てはまったらぜひ!
- ファイルディスクリプタって何? どう動いているの?
- デーモンプロセスが必要な場合と、そうではない場合の判断の仕方
- fork(2)を使って子プロセスを生成する、とは?
- プロセスを終了させる方法が4つもある
- スクリプトから外部コマンドを実行する際の懸念事項とその回避方法
- プロセス生成のコストと落とし穴について
- 見よう見まねじゃない、シグナルハンドラの定義の仕方
- ResqueとUnicornの内部ではUnixプロセスをどう扱ってるか
補足
私は普段PHPを触っていますが、Rubyで書かれていることに対して特に読みにくいと感じることはありませんでした。むしろ、少しRubyのコードに触れられるので一石二鳥かもしれません。
ちなみに、rubyのコンテナはDebian系のディストリビューションなので、パッケージはapt
で追加します。
apt-get update
その後に、
apt-get install man
すると良いです。コンテナで簡単なコード書くことがあると思うので、vim
とコマンドのマニュアルを見る為のman
は入れておくと便利だと思います。
この記事を通じて、プロセスについての理解が深まり、興味を持っていただければ幸いです。
ちなみに英語だとタダで読めるっぽいです。
https://workingwithruby.com/