プロセスとジョブについてまとめてみる
はじめに
多少は実践的にLinux使えるようになりたいと思い書籍「新しいLinuxの教科書」を読み進めています。
本記事では「新しいLinuxの教科書」で学んだ内容と別途気になって調べた内容や知識も含めアウトプットしていきます。
前回の記事の続きとなっております。
プロセスとは
Linuxにおける実態はディスク上に保存されたファイルです。
コマンドを実行するとLinuxカーネルはディスクから実行ファイルを読み出してメモリに格納し、メモリの内容に従ってCPUがプログラムを実行します。
ここで、メモリ上で実行状態にあるプログラムのことを「プロセス」と呼びます。
ディスク
Linuxにおけるディスクとは、物理的に存在するハードディスクやSSDなどのストレージデバイスのことを指します。ディスクには保存されたファイルやディレクトリなどの情報が記録されています。
メモリ
メモリとは、コンピュータが実行するプログラムやデータを一時的に保持するためのハードウェア装置です。メモリには、主に以下の2つの種類があります。
- プログラムを格納する「読み込み専用メモリ(ROM: Read-Only Memory)」
- プログラムが実行される際にデータを保持する
プロセスとメモリの関連性
プロセスとメモリには密接な関係があります。
メモリ上で実行されるプログラムの実体であるプロセスの実行に必要なデータやコードはメモリ上に展開されます。
プロセスの実行に必要な領域がメモリ上に割り当てられ、その領域にプログラムのコードやデータが読み込まれます。
psコマンド - プロセスの表示
現在動作しているプロセスを表示するには psコマンド
を利用します。
引数なしで実行すると現在のターミナルで実行しているプロセスだけを表示します。
# 実行 ps # 結果 PID TTY TIME CMD 1207 ttys000 0:00.51 /usr/local/bin/zsh -il 2122 ttys001 0:02.52 -zsh 7424 ttys001 0:01.57 foreman: master 7425 ttys001 0:09.09 puma 4.3.1 (tcp://0.0.0.0:5000) ...略
上記の例で言うと、PIDはプロセスに割り当てられたID、CMDは実行されているコマンドです。
すべてのプロセスの表示
Linuxではログイン中のユーザが実行しているプロセス以外にもLinuxのシステム自体を管理するためのプロセスがはじめから動いています。
これらの多くはスーパーユーザーの権限で実行されています。
(スーパーユーザーや権限について知りたい方は昨日書いた記事[ ファイルの各権限の見方・操作・sudoについて ]がありますのでこちらをご覧ください。)
ps axコマンド - システムで動作しているプロセスすべてを表示する
ps axコマンドを実行することで、すべてのプロセスを表示することができます。
# 実行 ps ax # 結果 PID TT STAT TIME COMMAND 1 ?? Ss 430:59.80 /sbin/launchd 87 ?? Ss 64:51.21 /usr/libexec/logd 88 ?? Ss 32:38.28 /usr/libexec/UserEventAgent (System) 91 ?? Ss 2:36.11 /System/Library/PrivateFrameworks/Uninstall.framework/Resources/uninstalld 92 ?? Ss 110:03.40 /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/FSEvents.framework/Versions/A/Support/fsevents 93 ?? Ss 2:52.44 /System/Library/PrivateFrameworks/MediaRemote.framework/Support/mediaremoted 94 ?? Ss 72:37.79 /Library/Application Support/org.pqrs/Karabiner-DriverKit-VirtualHIDDevice/Applications/Karabiner-DriverKit-VirtualHID 95 ?? Ss 134:38.13 /Library/Application Support/org.pqrs/Karabiner-Elements/bin/karabiner_observer 97 ?? Ss 190:42.04 /Library/Application Support/org.pqrs/Karabiner-Elements/bin/karabiner_grabber 98 ?? Ss 911:02.51 /usr/sbin/systemstats --daemon ...略
何も作業していない状態でも数十個以上のプロセスが動いています。
Linuxではさまざまなプロセスが同時に動作しているという認識を持っておけると良さそうです。
よく使われるオプション
psコマンドのオプションについてまとめておきます。
オプション | 説明 |
---|---|
x | psを実行したユーザーのすべてのプロセスを表示する。 |
ux | xコマンドに+αでユーザー名、開始時刻、CPU使用量などの詳細情報も合わせて表示する。 |
ax | すべてのユーザーのプロセスを表示する。 |
aux | axコマンドに+αでユーザー名、開始時刻、CPU使用量などの詳細情報も合わせて表示する。 |
auxww | auxと同様に、すべてのプロセスと詳細情報を表示し、行が見切れる部分もすべて表示する。 |
ジョブとは
ジョブとプロセスは似ている概念で、両方ともコンピュータにおいて実行されるタスクを表しています。ただし、その目的や性質が異なります。
プロセスは、OSレベルで動作している実行中のプログラムのことを指します。
一方でジョブは、シェルによって管理される一連のプログラムやタスクの実行のグループ
を指します。
以下は |(パイプ)を使って3つのコマンド(プロセス)を実行する例になりますが、ジョブは1つになります。
# 実行 ls -l / | cat -n | less
ちなみに上記のコマンドは、ルートディレクトリ以下の全てのファイルやディレクトリをリストし、それを行番号を付けてページングで表示するコマンドです。
ls
コマンドはファイルやディレクトリを表示し、cat -n
コマンドは行番号を付けて表示します。|
はパイプ演算子で、左側のコマンドの結果を右側のコマンドの入力として渡します。less
コマンドはページング表示するコマンドで、スペースキーで次ページ、Qキーで終了することができます。
結果は以下のようになります。
# 結果 ~/w/整/linux_test ❯❯❯ ls -l / | cat -n | less 1 total 10 2 drwxrwxr-x 49 root admin 1568 4 8 09:05 Applications/ 3 drwxr-xr-x 68 root wheel 2176 7 25 2022 Library/ 4 drwxr-xr-x@ 9 root wheel 288 7 14 2022 System/ 5 drwxr-xr-x 5 root admin 160 7 14 2022 Users/ 6 drwxr-xr-x 6 root wheel 192 4 4 07:51 Volumes/ 7 drwxr-xr-x@ 38 root wheel 1216 7 14 2022 bin/ 8 drwxr-xr-x 2 root wheel 64 6 6 2020 cores/ ...略
バックグラウンドジョブとフォアグラウンドジョブ
シェルは、ジョブを管理するためにジョブ制御という機能を持っており、その中にはバックグラウンドジョブやフォアグラウンドジョブなどがあります。
フォアグラウンドジョブ
フォアグラウンドジョブ
は、端末に対して入出力を行うプロセスで、ユーザーから入力を受け付け、出力を返します。
処理が完了するまでユーザーの操作をブロックする性質があります。
例えば、Webサイトでフォームを送信してからデータのバリデーションや登録が完了するまで待たされる場合があります。
これは、フォアグラウンドで処理が行われているためです。
フォアグラウンドジョブの例としては、以下のようなものがあります。
- ユーザーが投稿したデータのバリデーションと保存
- 非同期的に動作するJavaScript処理
- 計算処理が短い場合の動作
バックグラウンドジョブ
バックグラウンドジョブ
は、端末に対して入出力を行わず、シェルとは別のプロセスとして実行されます。
非同期的に処理を実行
するため、ユーザーの操作をブロックすることがありません。
バックグラウンドジョブを使うことで、ユーザーは他の操作を行いながら、処理の完了を待つことができます。
バックグラウンドジョブには、Sidekiq、Resque、Delayed Jobなどのライブラリがあります。
jobsコマンド
シェルは、バックグラウンドジョブを実行する際に、そのジョブが完了するまで待たずに、他のコマンドを実行できるようにします。
ジョブを一覧表示するためには、jobs
コマンドを使用します。
jobs
コマンドは、バックグラウンドで実行中のジョブの一覧を表示し、その状態やジョブIDなどの情報を表示します。
バックグラウンドジョブの例としては、以下のようなものがあります。
- 大量のデータを処理するバッチ処理
- ユーザーが登録したタスクの処理
- 重い画像のリサイズや変換
Railsを例にしますが、RailsではActive Jobというジョブフレームワークがあり、バックグラウンドジョブの実行に対応しています。
Active Jobは、バックグラウンド処理のためのインターフェースを提供し、いくつかのバックエンド(Sidekiq、Resque、Delayed Jobなど)に対応しています。バックエンドを選択することで、アプリケーションに最適なジョブ実行環境を構築することができます。
プロセスの終了
killコマンド
プロセスの終了は、kill
コマンドを利用します。
以下のようにプロセスID(PID)を指定することで、対象のプロセスを強制終了させます。
# 実行 (プロセスの確認) ps aux | grep ruby # 結果 user 1234 0.0 0.2 12345 6789 pts/0 S+ 00:00 0:01 ruby app.rb user 5678 0.0 0.1 12345 6789 pts/1 S+ 00:00 0:01 ruby app.rb # 実行 (プロセスの終了) kill 1234
上記によって1234のプロセスは終了することができます。
他人のプロセスは勝手に終了させることはできないようになっています。
# 実行 ~/w/整/linux_test ❯❯❯ kill 90562 # 結果 kill: kill 90562 failed: operation not permitted
ただし、スーパーユーザ権限を使用するとすべてのユーザのプロセスを終了させることができます。
前回の記事でもお伝えしたとおり、使用する際は最新の注意を払って最小限にとどめておきましょう。シグナル
シグナル
シグナルとは、プロセスに対する通知の一種であり、外部から実行中のプロセスに向けて送られる短い情報のことを指します。
先ほど解説したkillコマンドは厳密にいうとプロセスを終了するコマンドではなく「シグナルを送信する」
コマンドになります。
シグナルは、killコマンドを利用することでプロセスに送信することができます。
killコマンドの基本的な書式は以下のようになります。
kill [シグナル名] PID
Dockerを例にしてみる
Dockerのコンテナ内でプロセスを実行している場合、Dockerコンテナ内のプロセスに対してシグナルを送信することができます。
Dockerコンテナ内で実行されているプロセスにシグナルを送信するには、次の手順を実行します。
1、DockerコンテナのIDを確認する
docker ps
2、Dockerコンテナ内で実行されているプロセスのPIDを確認する
docker exec [コンテナID] ps -ef
3、Dockerコンテナ内のプロセスにシグナルを送信する
-s
オプションは、Dockerデーモンのソケットファイルを指定するオプションです。Dockerデーモンに接続する場合に使用されます。
docker exec [コンテナID] kill -s [シグナル番号] [PID]
ただし、Dockerコンテナ内でシグナルを送信する場合、一部のシグナルはコンテナ内でハンドリングされずにホストシステムに伝播する可能性があるため、注意が必要です。
また、Dockerコンテナ内でのシグナルの扱いには、Dockerのバージョンによって異なる仕様があるため、公式ドキュメントを確認することをおすすめします。
続く…
コメント
本記事の内容は以上になります!
書籍の続きのアウトプットも随時更新したいと思います。
プログラミングスクールのご紹介 (卒業生より)**
お世話になったプログラミングスクールであるRUNTEQです♪
こちらのリンクを経由すると1万円引きになります。
RUNTEQを通じて開発学習の末、受託開発企業をご紹介いただき、現在も双方とご縁があります。
もし、興味がありましたらお気軽にコメントか、TwitterのDMでお声掛けください。