LoginSignup
22
16

More than 3 years have passed since last update.

プロセスとジョブについて調べた

Last updated at Posted at 2019-12-05

プロセスとジョブについて無知だったので少し調べてみた

プロセスとは

プロセスとは、メモリ上で実行状態にあるプログラム

それぞれのプロセスにはプロセスIDという一意のIDが振られ、これによって適切にプロセスを管理することができる。プロセスIDはプロセスが終了するまで変化しない。

プロセスには、ファイルのオーナーと同様に実行ユーザーが設定されており、他人のプロセスを操作することはできない。

プロセスが新しく作られる場合には、既に存在しているプロセスから、別のプロセスが作成される。元となるプロセスを親プロセス、作成されるプロセスを子プロセスと呼ぶ。具体例としてlsコマンドを実行すると、親プロセスはシェル、子プロセスがlsコマンドのプロセスになる。

Linuxではログイン中のユーザーが実行しているプロセス以外にも、Linuxシステム自体を管理するプロセスが初めから動いている。これらの多くはスーパーユーザの権限で実行されている

psコマンド

現在動作しているプロセスを表示するコマンド。オプションなしで実行すると、現在のターミナルで実行しているプロセスだけが表示される。

実行例

PID TTY           TIME CMD
89124 ttys000    0:00.05 /Applications/iTerm.app/Contents/MacOS/iTerm2 --server <= Itermのプロセス
89126 ttys000    0:00.32 -zsh <= zsh関連
88296 ttys001    0:01.40 /usr/local/bin/zsh -l <= zsh関連
  • PID: プロセスID
  • CMD: 実行されているコマンド
  • TTY: 実行されているターミナル

psコマンドのオプション

psコマンドの一例を紹介

xオプション

現在のユーザが実行している全てのプロセスを表示する

aオプション

自分のプロセスだけでなく、システムで動いている全てのプロセスを表示するためには、xオプションに加えてaオプションを追加する

uオプション

CPUやメモリの使用率なども表示する

よく使うオプション

psコマンドを実行する際に、頻繁に利用する機械のあるオプションの組み合わせ

ux オプション

psコマンドを実行したユーザの全てのプロセスを、詳細情報を合わせて表示
する

aux オプション

全てのユーザのプロセスを、詳細情報を合わせて表示する

ジョブとは

シェルから見たときの処理の単位をジョブと呼ぶ(プロセスはカーネルから見たときの処理の単位)。シェルのコマンドラインに入力した1行が1つのジョブになる

実行例
history | grep git

  • 作成されるプロセスはhisotrygrep gitで2つ
  • 作成されるジョブはhistory | grep gitで1つ

プロセスはシステム全体で一意のプロセスIDを持つが、ジョブはシェルごとにジョブ番号を持つ。つまり、複数のターミナルを複数開き、複数のシェルを同時に利用している場合、ジョブ番号は重複する。

jobsコマンド

現在のジョブ一覧を表示するコマンド

ジョブの状態

フォアグラウンド

ユーザが対話的に操作しながら処理が実行されている状態

fgコマンド

ジョブをフォアグラウンドで実行するコマンド

バックグラウンド

ユーザが対話的に操作せずに処理が実行されている状態

bgコマンド

処理をバックグランドにするコマンド

停止

処理を一時的に中断している状態

Ctrl + z

処理を一時的に停止させる

ジョブの状態遷移のまとめ

  • フォアグラウンド => 停止 : Ctrl + z
  • バックグラウンド => フォアグラウンド : fgコマンド
  • 停止 => フォアグラウンド : fgコマンド
  • 停止 => バックグラウンド : bgコマンド

killコマンド

プロセスやバックグラウンドのジョブを終了させるために使われるコマンド。正確には「シグナルを送信する」コマンド。シグナルとはプロセスに送信される信号。

シグナルの種類によって「終了」「停止」「再起動」などの様々な振る舞いをする。実行中のプロセスに対してシグナルを送ることで、プロセス間で通信を行うことができる。

killコマンドで送るシグナル

killコマンドで送信するシグナルの種類はkill -<シグナル名>で指定することができる。シグナル名を省略すると、デフォルト値としてTERMというシグナルを送信する。つまり、以下の2つのコマンドは同じ意味になる。

kill 100
kill =TERM 100

TERMはterminate、つまり終了を意味する。

また、シグナルにはシグナル番号がついており、オプションをシグナル番号で指定することができる。TERMのシグナル番号は15番となっており、kill -15 100も上のコマンドと同じ意味になる。

シグナルの種類はkill -lで確認することができる

$ kill -l
HUP INT QUIT ILL TRAP ABRT EMT FPE KILL BUS SEGV SYS PIPE ALRM TERM URG STOP TSTP CONT CHLD TTIN TTOU IO XCPU XFSZ VTALRM PROF WINCH INFO USR1 USR2

フォアグラウンドのジョブに対してのCtrl + zはTSTP(停止)、Ctrl + cはINT(終了)というシグナルを送信する。

22
16
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
22
16