【初心者向け】Linuxのプロセスについて一通りわかる!

  • このエントリーをはてなブックマークに追加
  • Pocket
Linuxのプロセス

プロセスとは、Linuxで動いているプログラムのことだ。

自動的に起動しているものや、シェルからコマンドで実行されるものも含めてプロセスと呼ぶ。

このページではLinuxのプロセスについてまとめてご紹介する。Linux初心者の方は参考にしてほしい。

プロセスとは?

プロセスは実行中のプログラム

プロセスとは、「実行中のプログラム」だと思えばいい。

また、一つのプログラムから複数のプロセス(プログラム)が生成されることも多くある。

Linuxの場合デスクトップ環境だと、100個以上のプロセスがあるだろう。後ほど詳しく解説するが、topコマンドなどで現状が確認できる。

プロセスの管理

プロセスが多数起動していると、当然コンピュータリソースを消費することになる。管理上「安定動作時のプロセスの数がどれくらいなのか?」を把握しておくとよいだろう。

OSは、プログラムに適切なコンピュータ資源、メモリやCPU時間などを割り振ることになる。

割り振られたリソースの上でプログラムはオペレーティングシステム上のプロセスとして稼動することになる。プロセスは基本的に役目を果すと終了して、メモリなどの資源を開放する。

サーバ関係のプロセスの場合「デーモン」といわれ、基本的にユーザから手続のもと「終了してくれ」といわないかぎり稼動し続ける。

デーモンという言葉も今後よく聞くことになるので意味は把握しておこう。

ゾンビプロセス

また役目を終えているのにメモリを開放しない状態のプロセスを「ゾンビプロセス」という。

ゾンビプロセスになった場合ユーザからkillコマンドを発行しプロセスを無理矢理終了させることになる。killコマンドについても後ほどお伝えする。

マルチタスクとは?

前提として、「タスク = プロセス」だと思っていい。呼び方が違うだけだ。

同時に複数のプロセスを稼動できるシステム、その仕組みを「マルチタスク」という。こちらも言葉だけご紹介しておこう。理解できなければ飛ばしてもらって構わない。

基本シングルコアCPUは一度に一つしか命令を実行できない。

そう聞くと「うちのパソコン、たしかデュアルコアだけ、WordもExcelもブラウザも同時に使えてるけど?」という疑問が湧くかもしれない。

本当はデュアルであれば2つしか動かせないが、そんなことをしていたら不便極まりない。

コンピュータは、「人にはとらえられないほどの勢いで、実行するプロセスを切り替えている」。

結果、我々はプロセスが同時に実行されているように錯覚するのである。マルチタスクは現代CPUの力技で実現されている。

プロセスの確認を実際にやってみよう

前置きが長くなったが実際にコマンドを打って実体験してみよう。

psコマンド

$ ps

ps

と打ってみよう。この段階では情報量は非常に少ない。ほぼ情報が得られない。なのでとりあえず次のようにコマンドを打ってみてほしい。

$ ps aux

ps aux

だいぶ情報量が増えたはずだ。a u xオプションでシステムに走っている全てのプロセスを表示してくれる、項目は

  • 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

ps auxfオプション

pstreeコマンド

$ pstree

pstree

としてみよう、このコマンドを使うとプロセスの家系図が把握できる。

$ pstree -apuc

pstree apucオプション

とすると詳細な情報がえられる。

pstreeオプション

-a コマンドラインの引数を表示する

-c 同じ内容のツリーをまとめないで表示する

-n プロセスIDでならびかえて表示する

-p プロセスIDを表示する

-u ユーザIDを表示する

topコマンド

$ 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

起動時のコマンドライン引数が記述されている。

comdline

$ ls -lah cwd

起動したときのカレントディレクトリへのシンボリックリンクが設置されている。

cwd

$ cat environ

起動時の環境変数一覧が表示される。

cat environ

$ ls -lah exe

起動したプログラムへのシンボリックリンクが設置されている。

exe

$ cat status

そのプロセスに関しての全体情報が記述されている。

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などのコマンドは慣れるまで何度も叩こう。

  • このエントリーをはてなブックマークに追加
  • Pocket

このページの続きや関連ページは下記から一覧で確認できる。

短期間でエンジニアになる方法

・「まったくの初心者だけどエンジニアになりたい!」

・「プログラマーとして転職をしたい!」

という方はリナックスアカデミーの資料を見てみてください。短期間で未経験からエンジニアになることができるスクールとして15年間選ばれ続けてきた理由やノウハウが載った資料です。

エンジニアの入り口に立つために必要な勉強技術の最新動向本当に使えるIT資格学習に役立つ国からの奨励金などの情報が詰まっています。

無料で2,3日中にお手元にお届けします。


資料を見てみる

SNSでもご購読できます。

コメント

コメントを残す

*