プロセスとは、Linuxで動いているプログラムのことだ。
自動的に起動しているものや、シェルからコマンドで実行されるものも含めてプロセスと呼ぶ。
このページではLinuxのプロセスについてまとめてご紹介する。Linux初心者の方は参考にしてほしい。
目次
プロセスとは?
プロセスは実行中のプログラム
プロセスとは、「実行中のプログラム」だと思えばいい。
また、一つのプログラムから複数のプロセス(プログラム)が生成されることも多くある。
Linuxの場合デスクトップ環境だと、100個以上のプロセスがあるだろう。後ほど詳しく解説するが、topコマンドなどで現状が確認できる。
プロセスの管理
プロセスが多数起動していると、当然コンピュータリソースを消費することになる。管理上「安定動作時のプロセスの数がどれくらいなのか?」を把握しておくとよいだろう。
OSは、プログラムに適切なコンピュータ資源、メモリやCPU時間などを割り振ることになる。
割り振られたリソースの上でプログラムはオペレーティングシステム上のプロセスとして稼動することになる。プロセスは基本的に役目を果たすと終了して、メモリなどの資源を開放する。
サーバ関係のプロセスの場合「デーモン」といわれ、基本的にユーザから手続きのもとに「終了してくれ」といわないかぎり稼動し続ける。
デーモンという言葉も今後よく聞くことになるので意味は把握しておこう。
ゾンビプロセス
役目を終えているのにメモリを開放しない状態のプロセスを「ゾンビプロセス」という。
ゾンビプロセスになった場合にはユーザからkillコマンドを発行しプロセスを強制的に終了させることになる。killコマンドについても後ほどお伝えする。
マルチタスクとは?
前提として、「タスク = プロセス」だと思っていい。呼び方が違うだけだ。
同時に複数のプロセスを稼動できるシステム、その仕組みを「マルチタスク」という。こちらも言葉だけご紹介しておこう。理解できなければ飛ばしてもらって構わない。
基本シングルコアCPUは一度に一つしか命令を実行できない。
そう聞くと「うちのパソコン、たしかデュアルコアなのに、WordもExcelもブラウザも同時に使えてるけど?」という疑問が湧くかもしれない。
本当はデュアルであれば2つしか動かせないが、そんなことをしていたら不便極まりない。
コンピュータは、「人にはとらえられないほどの勢いで、実行するプロセスを切り替えている」。
結果、我々はプロセスが同時に実行されているように錯覚するのである。マルチタスクは現代CPUの力技で実現されている。
プロセスの確認を実際にやってみよう
前置きが長くなったが実際にコマンドを打って実体験してみよう。
psコマンド
$ ps
と打ってみよう。この段階では情報量は非常に少ない。ほぼ情報が得られない。なのでとりあえず次のようにコマンドを打ってみてほしい。
$ ps aux
だいぶ情報量が増えたはずだ。psの後にある「aux」は「a」「u」「x」という3つのオプションを繋げて記述している。それらのオプションを付ける事により、上記のようにシステムに走っている全てのプロセスを表示してくれる、項目は
- USER:実行しているユーザ名
- PID:プロセスに割り振られた識別番号つまりプロセスID
- %CPU:CPUの使用率
- %MEM:メモリ使用率
- VSZ:プロセスが確保しいる仮想メモリサイズ
- RSS:実際に使用されているメモリ量
- TTY:端末名
- STAT:プロセスの状態を表示
- START:コマンドが起動した時刻
- TIME:プロセスが実行された総実行時間
- COMMAND:コマンド名
となっている。STATはプロセスの状態を表示している。
大まかに以下のような状態がある。
- S スリープやユーザからの入力待ち
- D ディスクの入出力待
- R 実行可能または実行中
- T サスペンドシグナルを送られて実行中断
- Z ゾンビ状態
- < スケジュール優先度引き上げ
- N スケジューリング優先度引き下げ
- L メモリのページをロックして利用している
- s セッションリーダである
- + フォアグラウンドプロセスグループ
ptsはターミナルなどの仮想端末だ。対してttyは実端末を指している。「?」の場合端末のないプロセスとなる。デーモンなどのプロセスは端末を持たない。
以上の事柄を知っておくと大体の状態が把握できるだろう。psには大量のオプションが存在するが特に「ps aux」 あたりはよく使うものだ、注意してもらいたいのは 「ps -aux」とは違うということだ、習慣的にオプションを指定するときに「-」をうってしまうがpsの一部オプションを使用する場合は「ps aux」のようにしよう。psのmanコマンド(マニュアル表示コマンド)曰く、
$ man ps
このバージョンの ps が受け付けるオプションにはいくつかの種類がある。
1 UNIX オプション。まとめることが可能で、前にはダッシュを置かなければならない。
2 BSD オプション。まとめることが可能で、ダッシュを使ってはならない。
3 GNU ロングオプション。前に二つのダッシュを置く。
とあるのでBSD オプションを使用する場合「-」はうたないことに気をつけよう。
またプロセスツリーを表示してほしいときは「ps auxf」とするとプロセスのツリーが表示される。ただし、「pstree」というコマンドがあるのでそちらを使った方がいいだろう。
$ ps auxf
pstreeコマンド
$ pstree
としてみよう、このコマンドを使うと何層にもわたるプロセスの親子関係が把握しやすくなる。
$ pstree -apuc
とすると詳細な情報がえられる。
pstreeオプション
-a コマンドラインの引数を表示する
-c 同じ内容のツリーをまとめないで表示する
-n プロセスIDでならびかえて表示する
-p プロセスIDを表示する
-u ユーザIDを表示する
topコマンド
$ top
このコマンドはリアルタイムにプロセスの状態を表示してくれる。
Windowsで例えるならば、タスクマネージャに近い。使ったことがあるだろうか? Windowsを持っている方は「Ctrl+Alt+Dell」を押して見てほしい。出てくるはずだ。
- topの状態で「k」を押すとプロセスにシグナルを指定してkillすることができる
- 「P」を押下するとCPU使用率順でソートしてくる
- ほか「M」を押下するとメモリ使用率順でソートしてくれる
気をつけていただきたいのは「状態をリアルタイムに表示してくれる」ので画面が変動するその分「プロセスIDを読み違える」ことがある。プロセスを間違えてkillしてしまうと、思わぬ事故につながるので気をつけよう。
プロセスをKillする
$ kill <プロセスID>
物騒な表現だが、基本的にはこれでプロセスを殺すことができる。
「ゾンビ」になってしまったプロセスや暴走してしまったプロセスがあった場合killコマンドを使うことになる。
もちろん一般ユーザは自分の権限で起動しているプロセスしかkillできないので、必要に応じてスーパユーザ権限でkillすることも念頭においておこう。
/proc/<プロセスID>
/proc/<プロセスID>にあるそれぞれのファイルもしくはディレクトリの下には、プロセスの基本情報が記述されたファイルが納められている。沢山の情報があるが基本的なものを上げると
- cmdline
- cwd
- environ
- exe
- status
などだろう、それぞれcatで参照してみよう
$ cd /proc/<プロセスID>
$ cat comdline
起動時のコマンドライン引数が記述されている。
$ ls -lah cwd
起動したときのカレントディレクトリへのシンボリックリンクが設置されている。
$ cat environ
起動時の環境変数一覧が表示される。
$ ls -lah exe
起動したプログラムへのシンボリックリンクが設置されている。
$ cat status
そのプロセスに関しての全体情報が記述されている。
initとプロセスの親子関係
最後に覚えておきたいinitプロセスについて解説をしておく。
initプロセス
「init」というプロセスはLinuxにおいて必ずプロセスID(プロセスにわりふられる識別番号)1番が割り当てられる。「ps aux」コマンドを再度見てみてほしい。
initプロセスは、システムの根幹のプロセスだ。Linuxの一番偉いプロセスといえる。
このプロセスはシステム起動時にinitプログラムによって生成される。initはデーモンとして稼動し、全てのプロセスの親となる。
Linuxの場合カーネルがディスクから読みだされ、デバイスなどのシステムを初期化し終わった直後に起動するプロセスである。
全てのプロセスはinitから樹木構造のように枝分かれしながら生成されていくことになる。
もちろんinitだけでなく他のプログラムからプログラムが呼び出し、プロセスを生成することも多い、このとき呼び出した側のプロセスが「親」となり、呼び出された側のプロセスは「子」という扱いになる。pstreeコマンドを使うとプロセスの親子関係をわかりやすくツリー化したものが表示される。
親をkillした時はどうなる?
子プロセスを残したまま親プロセスがkillされてしまった場合その子プロセスはどうなるのだろうか?
その場合Linuxでは「initプロセスの養子」となるようになっている。「親プロセスがいなくなったからといって子プロセスが停止するとは限らない」ところに気をつけてほしい。
しかし一般的なデーモンプログラムなどは自分が死ぬときは基本的に子プロセスをkillしてから寿命をまっとうするようになっている場合が多いだろう。
まとめ
このページではLinuxのプロセスについてまとめてみた。
Linuxプロセスの管理は、Linuxを使って行く上で必ず実施することだ。psなどのコマンドは慣れるまで何度も叩こう。
a u xオプション
無駄にスペースが挿入されている。
ご指摘いただきありがとうございます。
オプション表記につきましては3つのオプションを分けて記述する意図でスペースを入れたものですが、わかり辛いため修正いたしました。
引き続き、ご愛読のほど、よろしくお願いいたします。
プロセス管理の章についてです。
「プロセスは基本的に役目を果すと終了して、メモリなどの資源を開放する。」
役目を果す → 役目を果たす ではないでしょうか。
いつもご愛読いただきありがとうございます。
該当部分の修正を行いました。
今後とも、ご愛読のほどよろしくお願いいたします。
親を殺すとか、自分が死ぬ時は子を殺してから死ぬ、とか
まさかこんな文章にこんなところで出会うとは思いませんでした。
とても分かり易かったです。