UNIX/Linux及びシェルにはプロセスとジョブという概念がありますが、Windowsで言えばタスクマネージャーのプロセスとアプリケーションに当たります。
sh/bashで稼働中のプロセスを確認するにはUNIX/Linuxコマンドであるpsコマンド、実行中のジョブを確認するにはbash組み込みコマンドであるjobsコマンドを使います。
psコマンド例
$ ps
PID PPID PGID TTY UID STIME COMMAND
1234 5678 2234 1 1000 10:00:00 /usr/bin/bash
...
※process statusの略
例えば、ログインシェルからサブシェル(bashまたは他のシェル)を立ち上げるとpsコマンドの結果には各種IDの異なるもう一つのシェルが表示されます。
ここでPIDはプロセスIDと言う識別番号で、PPIDは、PID識別番号を持つコマンドの呼び出し元を表すので呼び出し元プロセスのPIDと呼び出されたプロセスのPPIDは同じということになります。
PGIDはプロセスグループIDと言う識別番号、TTYは端末かそうでないかを表すフラグで、そのコマンドが端末(コンソールやターミナルエミュレータ)から呼ばれた場合は1、そうでない場合は0になり、UIDは、ユーザー識別番号であるユーザーID、STIMEはプロセス開始時刻、COMMANDは実行中のコマンドです。
UNIX/Linuxを使っているとプロセスとジョブという言葉がよくでてきますが、基本的にプロセスは実行中のシェルやシステムコマンド/シェルコマンドの状態であり、ジョブは、コマンドを含めたワンライナーやスクリプトで実行中の作業のことです。
尚、シェル上で実行するスクリプトやコマンドの状態は、jobsコマンドで確認・管理することができますが、スクリプトもシェバング(#!/bin/shなど)で始まるシェル上で実行されるコマンドなのでシェル(/bin/shなど)のプロセスとして、例えば、Perlのワンライナーならperlのプロセスとしてpsコマンドで確認することもでき、停止(kill)することも可能です。
現在実行しているジョブを調べるコマンドは
$ jobs
でバックグラウンドで実行中のジョブが表示されます。
UNIX/Linuxはその誕生時から(擬似的な)マルチタスクを実現しており、その並行処理はフォアグラウンド(foreground/前面)とバックグラウンド(background/背面)で行われているものとしてそのように振る舞う仕様になっています。
フォアグラウンドで実行するジョブは1つ、バックグラウンドでは複数のジョブを実行(または停止)させておくことができるようになっています。
バックグラウンドでジョブを実行させることによってフォアグラウンドでは他の作業を実行できるので多少時間のかかるコマンドなど意図的にバックグラウンドで処理ができると便利です。
ジョブをバックグラウンドで実行させるには、
$ command &
のようにコマンドの末尾に[ & ]を付加し、既に実行中のジョブをバックグラウンドに移すには、なんらかのコマンドが実行中の
$ command
の状態で
$ command
[Ctrl]+[z]
と[Ctrl]と[z]キーを同時に押して処理を中断し、
bg
とします。
逆にバックグラウンドにあるジョブをフォアグラウンド(通常のコマンドラインでの実行状態)にするには、
fg
とすると、jobsコマンドのリストで[+]がついたジョブがフォアグラウンドに戻り、
fg %ジョブ番号
とするとそのジョブ番号のジョブがフォアグラウンドに戻ります。
ジョブ番号とはjobsでジョブがリストされた時に順次振られている連番で[+]がついたジョブはフォアグラウンドの次に優先されるジョブ、複数ある場合の他のジョブには[-]がついて[+]のジョブがフォアグラウンドに戻る度に次のジョブ番号のジョブの[-]が[+]になります。
バックグラウンドのジョブを削除するには
kill %ジョブ番号
と入力してEnterキーを押します。
尚、割愛しますが、killコマンドにはシグナルオプション[-s/-signal]があり、
kill -l
とするとシグナルの種類が表示されます。