僕とコードとブルーハワイ

omega (@equal_001) の日記

Linux/UNIXの勉強メモ3 プロセス、initとrunlevel

プロセス

パソコン起動すると、自動的にプロセスが立ち上がる。プロセスには一つひとつ番号が振られる。以下のコマンドで全プロセスが見れる。

# ps -A

 

実行結果例)

  PID   TTY         TIME    CMD

      1   ?             00:00:01    init

      2   ?             00:00:00     migration/0

                             :

8920   pts/1       00:00:00    ps

 

PID:プロセス識別子

TTY:入出力先。TTYの?は実機からだよという意味。ptsは仮想端末からだよという意味。sshとかXwindowを使用しているとこれになる。

TIME:プロセスの実行時間。ほとんど一瞬で終わると00:00:00とかになったりする。initはちょっと長いのかな、00:00:01かかってる。

CMD:実行ファイル名

 

実行結果例の最後のプロセスは、

pts/1(この時はXwindowから)からpsコマンドを命令されました。実行時間は一瞬で終了しました。このpsコマンドのプロセス番号は8920番です。

という意味になる。

プロセスの詳細を見たい時は

# ps alx

と命令すると項目が増える

 

実行結果例)

F  UID   PID    PPID  ・・(省略)・・   TTY   TIME    COMMAND

4   0      1        0                                        ?        0:01      init [5]

             :

0   0     5010   1                                        ?        0:05       gnome-terminal

             :

 

0   0     8890   5010                                  pts/1   0:00       bash

4   0     8920   8890                                  pts/1   0:00      ps

 

PPIDは親プロセスのことを指す。PPIDを辿ると、PID1のinitに行き着く。

psコマンドで表示されないけど、initの親プロセスのPID 0(よくswapperと呼ばれるらしい)は、物理メモリ上で使える記憶領域を確保する処理をしている。

カーネルの一部でほんとにほんとの最初の下準備としてやってるからpsででてこないのかな?(こやつの仕事の意味が調べてもいまいちわからなかった)

 

プロセスの親子関係を体系的に見たい時は以下のコマンドを実行する。

# pstree

ここには書かないけどps alxで出た親子関係がツリー状に表示される。やっぱり根っこはinitから始まっている。

 

・fork-and-exec

全部のプロセスはfork-and-execされてる

※あとでかく

 

 

initとrunlevel

・init

initは最初に実行されるコマンド。これを実行するためのスクリプトは/etc/inittabに書いてある。

・runlevel

runlevelはコンピュータシステムの状態を表すもの。runlevelは一桁の数字で分けられてる(Sは例外だけど)。

runlevelと状態の意味

0:電源が断たれている状態

1:管理状態(rootのみ使用可能)

S:シングルユーザモード。(runlevel1との区別は実際ない)

2:ネットワーク無しのマルチユーザモード。スタンドアロン状態。

3:ネットワーク有りのマルチユーザモード。サーバシステムが正常に動作している状態。

4:初期段階は使用されていない。管理者が自由に設定できる。

5:GUIからのログイン状態またはrootディスク以外からのブート状態。

6:リブート状態。実際はrunlevel1~5からrunlevel0に移行してリブートする。

 

rullevelが変わると実行すべきシェルスクリプトも変わる。すべてのシェルスクリプトは/etc/init.d./配下にある。

じゃあどうやってrunlevel毎に分けているかというと、/etc/配下にある「rc*.d/(*は数字が入る)」というディレクトリに、必要なシェルスクリプトが配置されている。

例えば、rc3.d/には、runlevel3になる為の実行スクリプトが配置されている。

そのまま実行スクリプトが置いてあるのではなく、/etc/init.d/に置いてあるシェルスクリプトシンボリックリンクが置かれている。

runlevel3からlunlevel5になるとき、rc5.d/配下にあるシェルスクリプトが読み込まれる。

 

各runlevelになったときに何かをさせたいときは、inittabにシェルスクリプトファイルを置いて対応するrunlevelのrc.d/にシンボリックリンクを貼るか、inittabに書いてしまう方法がある(記述するときrunlevelを指定すればおk。でもあまりいじるのはリスク高いかも)。

次回はシェルスクリプトの練習してみる。