プロセスとジョブについて無知だったので少し調べてみた
プロセスとは
プロセスとは、メモリ上で実行状態にあるプログラム
それぞれのプロセスにはプロセス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
- 作成されるプロセスは
hisotry
とgrep 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(終了)というシグナルを送信する。