Linuxのプロセスとサービスとは?ps・top・kill・systemctlを初心者向けに解説
Linuxでは、さまざまなプログラムが同時に動いています。
たとえば、
- Webサーバー
- SSHサーバー
- データベース
- Minecraftサーバー
なども、Linux上で動作するプログラムです。
では、
「今どんなプログラムが動いているのか?」
「動いているプログラムを停止するにはどうすればいいのか?」
「サーバーを再起動したあとも自動で起動させるには?」
こうしたLinux上で動くプログラムを管理するときに重要になるのが、プロセスとサービスです。
今回は、
ps、top、kill、systemctl
などを使いながら、Linuxで動いているプログラムを管理する基本を学びます。
プロセスとは?
**プロセス(Process)**とは、簡単にいうと、
実行中のプログラム
です。
たとえば、Linuxで何らかのプログラムを実行すると、そのプログラムはプロセスとしてLinux上で動作します。
イメージすると、
プログラム
↓
実行する
↓
プロセスとして動く
という関係です。
たとえばMinecraftサーバーの場合、
Minecraftサーバーのプログラム
↓
Javaで起動
↓
Minecraftサーバーのプロセスが動く
という形になります。
つまり、ファイルとして保存されているプログラムと、実際に実行されているプロセスは分けて考えることができます。
Linuxではたくさんのプロセスが動いている
Linuxでは、自分が直接起動したプログラム以外にも、さまざまなプロセスが動いています。
たとえば、
Linux
├── SSH関連のプロセス
├── ログ関連のプロセス
├── ネットワーク関連のプロセス
├── Webサーバー
└── その他のシステムプロセス
といったイメージです。
サーバーを運用していると、
「アプリケーションはちゃんと動いているのか?」
を確認する場面がよくあります。
そこで利用するのがpsやtopなどのコマンドです。
PIDとは?
Linuxでは、それぞれのプロセスに**PID(Process ID)**という番号が割り当てられます。
たとえば、
PID 1200 → プロセスA
PID 1350 → プロセスB
PID 2100 → プロセスC
というように、動いているプロセスを番号で識別します。
PIDは、
Linuxがプロセスを区別するための番号
と考えると分かりやすいです。
このPIDは、あとでプロセスを停止するときにも利用します。
ps:プロセスを確認する
現在動いているプロセスを確認する代表的なコマンドがpsです。
ps
実行すると、現在の端末に関連するプロセスなどが表示されます。
例:
PID TTY TIME CMD
3210 pts/0 00:00:00 bash
3250 pts/0 00:00:00 ps
ここでは、
PID
→ プロセスID
CMD
→ 実行されているコマンド
などを確認できます。
ps aux:より多くのプロセスを確認する
サーバー全体で動いているプロセスを確認するときによく利用されるのが、
ps aux
です。
たとえば、
USER PID %CPU %MEM COMMAND
root 1 0.0 0.1 /sbin/init
root 700 0.0 0.2 sshd
user01 2100 1.2 3.5 java
のように表示されます。
主な項目を見てみましょう。
| 項目 | 意味 |
|---|---|
USER |
プロセスを実行しているユーザー |
PID |
プロセスID |
%CPU |
CPU使用率 |
%MEM |
メモリ使用率 |
COMMAND |
実行されているコマンド |
ここで、前回学んだユーザーの知識もつながってきます。
プロセスには、
「どのユーザーがそのプロセスを動かしているのか」
という情報があります。
grepと組み合わせてプロセスを探す
ps auxを実行すると大量のプロセスが表示されます。
そこで、特定のプロセスを探したい場合にはgrepと組み合わせる方法があります。
たとえばJavaのプロセスを探すなら、
ps aux | grep java
とします。
ここで登場する、
|
は**パイプ(Pipe)**と呼ばれます。
簡単にいうと、
ps auxの結果
↓
grep javaへ渡す
↓
javaを含む行だけ表示
という処理です。
grepやパイプについては、テキスト編集・検索の記事でも詳しく扱います。
top:プロセスをリアルタイムで確認する
psは実行した時点のプロセス情報を表示します。
一方、
top
を利用すると、プロセスやCPU・メモリの状態を継続的に確認できます。
top
画面には、
- CPU使用率
- メモリ使用量
- プロセス
- PID
- プロセスごとのCPU使用率
- プロセスごとのメモリ使用率
などが表示されます。
イメージとしては、
Linuxサーバー
│
├── CPU使用状況
├── メモリ使用状況
│
└── プロセス一覧
├── process A
├── process B
└── process C
をリアルタイムで確認するためのコマンドです。
topを終了するときは、
q
を押します。
psとtopの違い
どちらもプロセスを確認するコマンドですが、使い方が少し違います。
| コマンド | 特徴 |
|---|---|
ps |
実行した時点のプロセスを表示 |
top |
プロセスやCPU・メモリを継続的に表示 |
たとえば、
特定のプロセスが存在するか確認したい
ならps、
サーバーの負荷をリアルタイムで見たい
ならtop、
という使い分けができます。
kill:プロセスを終了させる
動いているプロセスを終了させたい場合にはkillを利用できます。
まずpsなどでPIDを確認します。
ps aux
たとえば対象のPIDが、
2100
だったとします。
その場合、
kill 2100
と実行できます。
killという名前なので、
「強制終了するコマンド」
と思いやすいですが、実際にはプロセスへシグナル(Signal)を送るコマンドです。
通常の、
kill 2100
では、一般的にプロセスへ終了を要求するシグナルが送られます。
シグナルとは?
**シグナル(Signal)**とは、Linuxがプロセスへ送る通知のような仕組みです。
たとえば、
Linux
↓
「終了してください」
↓
プロセス
という形です。
代表的なものに、
SIGTERM
があります。
kill PIDでは通常、このSIGTERMが送られます。
SIGTERMは、
「終了処理を行って終了してください」
というイメージです。
kill -9はどう違う?
Linuxの記事や操作例を見ていると、
kill -9 2100
というコマンドを見かけることがあります。
-9はSIGKILLというシグナルです。
SIGKILLはプロセス側で通常の終了処理を行う余地を与えず、強制的に終了させます。
そのため、
まず通常の終了方法を試す
↓
それでも終了しない
↓
必要性を確認して強制終了を検討
という考え方が大切です。
最初から何でもkill -9で終了させるのは避けましょう。
プロセスとサービスは何が違う?
ここまでプロセスについて見てきました。
次に**サービス(Service)**について考えてみましょう。
プロセスは、
実行中のプログラム
でした。
一方、Linuxサーバーでは、
- SSHサーバー
- Webサーバー
- データベース
- 各種サーバーアプリケーション
など、継続的に動かしておきたいプログラムがあります。
こうしたプログラムをLinux上で管理するために、サービスとして扱うことがあります。
ざっくり整理すると、
プロセス
→ 実際に動いているプログラム
サービス
→ Linux上で継続的に動かすプログラムなどを
起動・停止・自動起動できるよう管理する仕組み
と考えると分かりやすいです。
systemdとは?
現在の多くのLinuxディストリビューションでは、システムやサービスの管理にsystemdが利用されています。
systemdは、
- サービスの起動
- サービスの停止
- サービスの再起動
- サービスの状態確認
- OS起動時の自動起動
などを管理します。
イメージすると、
systemd
│
├── SSHサービス
├── Webサーバー
├── データベース
└── その他のサービス
のような形です。
systemctlとは?
systemdによって管理されているサービスを操作するときによく利用するのが、
systemctl
です。
基本形は、
systemctl 操作 サービス名
です。
たとえばSSHサービスの状態を確認する場合、環境に応じたサービス名を指定して、
systemctl status ssh
などとします。
ディストリビューションによってはサービス名が異なる場合があります。
サービスの状態を確認する
サービスの状態を確認するときは、
systemctl status サービス名
を利用します。
たとえば、
systemctl status ssh
です。
正常に動いている場合、
active (running)
といった表示を確認できます。
つまり、
active
→ サービスが有効な状態
running
→ 現在動作している
と判断する材料になります。
サービスを起動する
サービスを起動するときは、
sudo systemctl start サービス名
です。
例:
sudo systemctl start ssh
これによってサービスを起動できます。
サービスを停止する
停止するときは、
sudo systemctl stop サービス名
です。
例:
sudo systemctl stop ssh
サービスを再起動する
設定変更などを行ったあとにサービスを再起動したい場合には、
sudo systemctl restart サービス名
を利用できます。
例:
sudo systemctl restart ssh
startとenableの違い
ここは初心者が混乱しやすいポイントです。
sudo systemctl start サービス名
は、今サービスを起動する操作です。
一方、
sudo systemctl enable サービス名
は、OS起動時などに自動的に起動するよう設定するために利用します。
つまり、
start
↓
今、起動する
enable
↓
OS起動時に自動起動するよう設定する
という違いがあります。
反対に、自動起動を無効にする場合は、
sudo systemctl disable サービス名
を利用できます。
systemctlの基本操作まとめ
| コマンド | 用途 |
|---|---|
systemctl status |
状態確認 |
systemctl start |
起動 |
systemctl stop |
停止 |
systemctl restart |
再起動 |
systemctl enable |
自動起動を有効化 |
systemctl disable |
自動起動を無効化 |
まずは、
status・start・stop・restart・enable
の5つを覚えておけば十分です。
Minecraftサーバーではどう使う?
このシリーズでは最終的にLinux上へMinecraftサーバーを構築します。
最初は、
java -jar server.jar nogui
のようにMinecraftサーバーを直接起動することになります。
この場合、MinecraftサーバーはJavaのプロセスとして動作します。
server.jar
↓
Javaで実行
↓
Javaプロセス
↓
Minecraftサーバーが動作
psなどを使えば、動いているJavaプロセスを確認できます。
しかし、この方法だけではサーバーを再起動したあとにMinecraftサーバーをもう一度手動で起動する必要があります。
そこで後ほどMinecraftサーバーをsystemdのサービスとして登録します。
すると、
sudo systemctl start minecraft
で起動したり、
sudo systemctl stop minecraft
で停止したり、
systemctl status minecraft
で状態を確認したりできるようになります。
さらに、
sudo systemctl enable minecraft
を設定することで、OS起動時にMinecraftサーバーを自動起動する構成も作れます。
ここで今回学んだ、
- プロセス
- PID
- systemd
- systemctl
- start
- stop
- status
- enable
がすべてつながってきます。
実際にプロセスを確認してみよう
まず現在動いているプロセスを確認してみましょう。
ps
次に、より多くのプロセスを確認します。
ps aux
リアルタイムで確認してみます。
top
確認できたらqで終了します。
次にsystemdで管理されているサービスの状態を確認してみましょう。
環境に存在するサービスを選び、
systemctl status サービス名
を実行します。
ここでは、
Active:
の部分に注目して、
そのサービスが現在動いているのか
を確認してみましょう。
この段階では無理にサービスを停止する必要はありません。
まずは、
「Linuxではたくさんのプロセスやサービスが動いている」
ことを確認できればOKです。
🍯 はちみつメモ
プロセスは「今動いているプログラム」!
Linuxでは、たくさんのプロセスが同時に動いています。
psやtopを使えば、「今、何が動いているのか?」
を確認できます。
そして継続的に動かしたいサーバープログラムなどは、systemdを利用してサービスとして管理できます。
Minecraftサーバーでも、この仕組みを実際に使います。
まとめ
今回はLinuxのプロセスとサービスについて学びました。
この記事で覚えること
- プロセスは実行中のプログラム
- プロセスにはPIDが割り当てられる
psでプロセスを確認できるtopでCPU・メモリ・プロセスなどを継続的に確認できるkillはプロセスへシグナルを送る- 通常の
kill PIDでは一般的にSIGTERMが送られる kill -9は強制終了なので必要性を確認して利用する- Linuxでは継続的に動かすプログラムなどをサービスとして管理できる
- 多くのLinux環境ではsystemdがサービス管理に利用されている
systemctlでサービスを操作できるstartは今起動するenableはOS起動時の自動起動を設定する- Minecraftサーバーも後ほどsystemdでサービス化できる
Linuxサーバーでは、
「今何が動いているのか?」
を確認できることが非常に重要です。
まずはpsやtopでプロセスを見ることに慣れ、そこからsystemctlを使ったサービス管理へ進んでいきましょう。
次におすすめ
次は**「Linuxのネットワーク」**について学びます。
Linuxサーバーに設定されているIPアドレスやルーティングを確認しながら、
ip addrip routepingsscurl
などのコマンドを使って、Linuxサーバーがどのようにネットワークへ接続しているのかを確認していきます。