Chrononglyph

linux

前へ1 / 2次へ
#8184

プロセスの大親分

今日の出来事linux

自分のweb制作知識は基本的に独学で、その都度必要になった知識のみを仕入れるスタンスでやってきました。
一口にweb制作といってもその範囲はめちゃくちゃ広範囲にわたっており、
自分が知る限りweb制作に必要な技術知識全部を網羅した本は存在しません。
そもそもプロの現場でもweb制作は扱う技術スタックもプロジェクトごとに異なる上、
専門ごとに分掌するのが当たり前であり、1人でwebサイトを全部作る方がレアなケースです。
一方、趣味でやっている場合は基本的に1人で全部作らざるを得ないので、横断的に知識を仕入れる必要があります。
そのハードルもAIによってずいぶん下がりましたが、
自分もいまだにおそらく業界の常識だろうに知らなかった概念と出会うことがたまにあります。


先日出会った「tini」もそのひとつです。
tiniとは、Dockerのコンテナに一番最初に起動するプロセスとして起動するように仕込んでおく
ごく小さなプロセス管理ソフトのことで、初期化を意味するinitを逆さから読んでいます。
通常、Linuxは起動すると最初のプロセス(=PID 1)としてsystemd(システムデーモン)が起動しますが、
これを代替するものという位置付けとしてtiniは存在します
systemdはわりと近年開発されたもので、かつてはinitというプロセスだったらしい)。


systemdはLinuxの根幹とも言うべきソフトで、OSが起動したら自動起動するソフトを設定するなどの機能を持っています。
LinuxではPID 1のプロセスは全プロセスの大親分のような特殊な役割を自動付与される仕組みになっていて、
ブートシグナルを受け取って最初に起動するsystemdはその役割も担っています。
たとえば他のプロセスが動いていて、そのプロセスの下で子プロセスが動いているとします。
ここでもしその親プロセスが死んだら子プロセスは行き場を失ってしまうわけですが、
PID 1であるsystemdはそうした行き場を失ったプロセスの親プロセスになります。


しかしsystemdそれ自体はLinuxの根幹を担うだけあってそれなりに重いソフトです。
これをDockerコンテナそれぞれに搭載していたらファイルサイズを無駄に食ってしまうことになり、
またコンテナ自体も軽量性をいくらか失うことになります。
Dockerは基本的にカーネルを基盤OSに依存して、差分だけコンテナ内に実装することで軽量化を実現しているため、
systemdをデフォルトで入れるのはその設計思想と相反するわけですね。
もちろんユーザーが自由に入れる分には構わないわけですが。


DockerコンテナでPID 1のプロセスを意図的に指定しない場合、
通常はそのコンテナで主に使用するプログラム(nodeなど)がPID 1になり、
これらがゾンビプロセスの親になってしまいます(あんまりないケースだと思いますが)。
また、Dockerではコンテナの起動・終了シグナルはPID 1のプロセスに飛ばしているので、
nodeなどアプリの動作を司るプロセスがPID 1だと応答に時間がかかるという問題も出てきます
(終了シグナルを正常に受け取れないので、毎回強制終了することになるらしい)。
これらを解決するために、PID 1の椅子に座ってもらうためだけに用意するのがtiniというわけです。


今回はたまたまDockerについて調べていたらこれにたどり着いたのですが、
思い返せばいま運用しているVPSではたまにゾンビプロセスが残っているのを昔から確認していて、
発生要因が分からなかったのでずっと放置していました。
それも今回、行き場を失った子プロセスがあることやコンテナ内はそれを引き受けるソフトが用意されていないことなど、
いろいろ分かってスッキリしたという感じです。
また、おかげでLinuxへの興味が一時的に高まりました。
web技術全体を網羅する本は存在しませんが、
Linuxのコマンドリファレンスなら売っているのでそういうのを買ってパラパラめくってみるのも面白そうだし、
まだ見ぬ常識的なコマンドもたくさんありそうだなと思った次第です。


#7025

コマンドラインを極めろ

思えばIDEもLinuxも初めて触ったのが上京してからということを考えると、
webクリエイターとしての自分はここ3年で間違いなくレベルアップしていると思います。
あれだけ抵抗感のあったフレームワークもどうにか触れているし、
最近はファイルの作成等の簡単な操作は
コマンドラインよりGUIの方が面倒くさいと思うようになってきました。
まあ、それを成長と言うのかは知りませんが。
とにかく上京前まではメモ帳とFFFTPといういにしえのソフトで開発していたことを考えると、
この3年で一気にモダン志向になったと思います。
たぶんもうテキストエディタのみの開発には戻れないんじゃないかなと。


ただ、コマンドにも多少慣れてきた自分にも当然まだまだ立ちはだかる壁があります。
Linuxそのものもまだ全然マスターできていないというのもありますが、
それ以上に克服したいのがLinux付属のテキストエディタであるVi(Vim)。
たったいまテキストエディタにはもう戻れないと書いておきながらテキストエディタの話かよ、
と思われるかもしれませんが、基本的にコマンドラインで全部どうにかするLinuxでは、
Viはファイルの中身を編集する数少ない手段です。
Linuxでは当然豪華なIDE(統合開発環境)は使えるはずもなく、
いかにメモ帳から卒業しようとも、むしろモダンになればなるほどViを避けることはできません。


そのViですが、一部には熱狂的なファンもいるほど独特な使い心地で、
これを使いこなしている人はVimmerと呼ばれてIT界隈でも尊敬の眼差しで見られるそうです。
それほど使いこなすのが難しいということなのでしょう。
なにしろ本当に初歩の段階では、文字を追記して保存して閉じることすらできません。
実際には、viコマンドで起動したら「i」で挿入モードに入って文字を入力できるようにし、
編集後「Esc」で通常モードに戻り、「:wq」で保存して閉じることができます。
なにしろGUIではないので各動作にコマンドが割り当てられていて、
まずはそのコマンドを覚えるところから始まるわけですね。
高度にカスタマイズされたVimはIDEに匹敵する機能を持っているそうですが、
当然ながらそれだけ覚えるコマンドも膨大なため一朝一夕ではとても使いこなすことはできません。


実はいまいる現場はネットワークの経路が非常に複雑で制限も多く、
そのネットワーク上で作業することがあるためIDEではなくViのお世話になることが多いです。
せっかくなので、これを機にもう少し使いこなせるようになりたいところ。
なんでもそうですが、やっぱり使う機会がないと上達しないですからね。


前へ1 / 2次へ