Yanonoblog!

こつこつと

プロセスとジョブについてまとめてみる

はじめに

多少は実践的にLinux使えるようになりたいと思い書籍「新しいLinuxの教科書」を読み進めています。

本記事では「新しいLinuxの教科書」で学んだ内容と別途気になって調べた内容や知識も含めアウトプットしていきます。

前回の記事の続きとなっております。

ファイルの各権限の見方・操作・sudoについて

プロセスとは

Linuxにおける実態はディスク上に保存されたファイルです。

コマンドを実行するとLinuxカーネルはディスクから実行ファイルを読み出してメモリに格納し、メモリの内容に従ってCPUがプログラムを実行します。

ここで、メモリ上で実行状態にあるプログラムのことを「プロセス」と呼びます。

ディスク

Linuxにおけるディスクとは、物理的に存在するハードディスクやSSDなどのストレージデバイスのことを指します。ディスクには保存されたファイルやディレクトリなどの情報が記録されています。

メモリ

メモリとは、コンピュータが実行するプログラムやデータを一時的に保持するためのハードウェア装置です。メモリには、主に以下の2つの種類があります。

  1. プログラムを格納する「読み込み専用メモリ(ROM: Read-Only Memory)」
  2. プログラムが実行される際にデータを保持する

プロセスとメモリの関連性

プロセスとメモリには密接な関係があります。

メモリ上で実行されるプログラムの実体であるプロセスの実行に必要なデータやコードはメモリ上に展開されます。

プロセスの実行に必要な領域がメモリ上に割り当てられ、その領域にプログラムのコードやデータが読み込まれます。

image

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です♪

https://runteq.jp/r/ohtFwbjW

こちらのリンクを経由すると1万円引きになります。

RUNTEQを通じて開発学習の末、受託開発企業をご紹介いただき、現在も双方とご縁があります。

もし、興味がありましたらお気軽にコメントか、TwitterのDMでお声掛けください。

https://twitter.com/outputky

参考