どーも!marusukeです!
Linuxの「ジョブ」について概要を説明します!
参考文献
「新しいLinuxの教科書」三宅 英明, 大角 祐介
ジョブとは?
ジョブとは、「シェルから見た処理の単位」のことです。
例えば、ユーザーがコマンドラインにコマンドを入力した1行が「1つのジョブ」になります。
ls
# 上記の1行が「1つのジョブ」です。
似たような言葉に、プロセスがあります。
プロセスは、「OSから見た処理の単位」のことです。
後ほど別の記事でプロセスについて解説します。
ジョブの状態遷移について
ジョブには3種類の状態があります。
- フォアグラウンド
- バックグラウンド
- 停止
3つの状態は、以下の表の通りです。
状態遷移を図で表すと以下のようになります。
ジョブの状態「停止」とは?
処理中のジョブを一時停止することです。
一時停止なので、処理を再開させるときは、ジョブの始まりからではなく、一時停止したタイミングから再開させることができます。
停止状態にするコマンド「Ctrl + z」の使い方
停止コマンド「Ctrl + z」の使い方です。
「Ctrl + z」使う状況は、フォアグラウンドで処理中のジョブを一時停止するときに使います。
例えば、カレントディレクトリにvi test.txtと入力し、新たにtest.txtを作成し、途中で「Ctrl + z」で停止してみます。
まず、vi test.txtと入力し、
text.txtをviエディタで開いた状態にします。この画面で「Ctrl + z」で停止します。
すると以下のようになります。ジョブが停止します。
「ジョブ番号」が割り振られ、「ジョブの状態」と「ジョブの内容」が表示されます。
これで停止コマンド「Ctrl + z」でジョブを停止させることができました!
ジョブの状態「フォアグラウンド」とは?
ユーザーが対話的に操作できる状態で、ジョブの処理が進む状態です。
なので、ユーザーが対話的に操作できる状態で、ジョブを進めたい場合、フォアグラウンドコマンドを使用します。
フォアグラウンド状態にするコマンド「fg」の使い方
フォアグラウンドコマンド「fg」の使い方です。
使う状況は、「Ctrl + z」で停止中のジョブやバックグラウンドで処理中のジョブを、対話的に入力できる状態に変えたいときに使用します。
今回は例として先程の「Ctrl + z」で停止したtest.txtジョブをフォアグラウンドに戻します。
以下の手順を行います。
- コマンドラインの任意のディレクトリで「vi test.txt」と入力し、test.txtをviエディターで開く
- 「Ctrl + z」で上記ジョブを停止する
すると以下の画面になります。
ジョブ番号が[1]のジョブをフォアグラウンドに戻します。以下のコマンドを入力します。
fg %[ジョブ番号]
今回はジョブ番号が「1」なので、以下のように「fg %1」と入力します。
なお、「%[ジョブ番号]」を付けない場合は、カレントジョブ(ジョブ番号の後に+が付いているジョブ)がフォアグラウンド状態になります。
すると、「vi test.txt」ジョブがフォアグラウンドになり、以下のように対話的に入力できる状態になります。
ここまでが「fg」コマンドの使い方でした!
ジョブの状態「バックグラウンド」とは?
バックグラウンド状態とは、ユーザーが対話的に操作できないジョブで処理が進行中の状態を言います。
「停止」しているジョブは処理が一時停止するのに対し、「バックグラウンド」のジョブは処理が続くことです。
なので、「停止」しているジョブの処理を進めたいときに、バックグラウンドコマンドは使用されます。
バックグラウンド状態にするコマンド「bg」の使い方
バックグラウンドコマンド「bg」の使い方です。
使う状況は、「停止」したジョブを、ユーザーが対話的に操作できない状態で処理を進めたいときに使用します。
以下のコマンドで、停止中のジョブをバックグラウンドで処理を進めることができます。フォアグラウンドと同様に「%[ジョブ番号]」を付けない場合は、停止中のカレントジョブが指定されます。
bg %[ジョブ番号]
今回は以下のような簡単なシェルスクリプトを作成して、以下の流れでバックグラウンドでの処理を例示します。
- testシェルスクリプトを作成する
- フォアグラウンドでtestシェルスクリプトのジョブを実行する
- testシェルスクリプトのジョブを停止する
- バックグラウンドでtestシェルスクリプトのジョブを進める
testシェルスクリプトの内容は以下の通りです。
#!/bin/bash
echo 'sleeping...'
sleep 20s
a=1
sum=$(($a + $a))
echo $sum
簡単に説明すると、
- #!/bin/bash =>このスクリプトがbashシェルスクリプトであると宣言するおまじない
- echo ‘sleeping…’ => sleeping…とコマンドライン上に表示します。
- sleep 20s => 20秒間このスクリプトの処理を一時停止させます。(ジョブの停止とは異なります)
- a=1 => 変数aに1を格納します。
- sum=$(($a + $a)) => 呼び出した変数a同士を足し算し、その結果を変数sumに格納します。
- echo $sum => 変数sumをコマンドライン上に表示します。
実行コマンドは、testシェルスクリプトの絶対パスになります。
testシェルスクリプトができたら以下の流れで実行コマンド(絶対パス)を確認し、実行します。
(自分の環境の場合だと、実行コマンドは「/home/test」と「test」を組み合わせて、/home/test/testとなりました。)
実行すると、ジョブが処理が始まり、以下の表示になります。
20秒間処理が止まるのでこの間に「Ctrl + z」でこのジョブを停止させてみます。
このtestスクリプト停止状態で「bg」と入力し、バックグラウンドで実行すると以下のようになります
処理が進むと、testスクリプト内の最後の処理「echo $sum」が実行され、「2」が表示されます。
3行目の末尾の「&」は、そのジョブの処理が実行中であることを示しています。
更にエンターを押すと、プロンプト(画像内の「$」のこと)の表示が戻ります。このときに、ジョブの状態が「Stopped」から「Done」に変化していることがわかります。
ここまでが「bg」コマンドの使い方でした!
ちなみに「bg %1」のようにジョブ番号を指定しても同じ内容になります。(今回はtestスクリプトがカレントジョブであったため、「bg」のみで実行することが出来ました。)
ジョブを始めからバックグラウンドで実行したい時は、末尾に「&」
バックグラウンドでジョブを実行したいときは、以下のように入力します。
[実行するコマンド] &
例えば、cpコマンドを実行したい時は、以下のように末尾に「&」を付けます。
cp test1.txt test2.txt &
ジョブを一覧で確認するコマンド「jobs」の使い方
「jobs」で確認できることは、バックグラウンドで実行中のジョブや停止中のジョブが一覧で表示されます。
例えば、バックグラウンド実行中や停止中のジョブがある場合、
「jobs」で以下のようなジョブ一覧を表示できます。
ジョブ番号が2の「/home/test/test &」の末尾「&」は、ジョブがバックグラウンドで進行中であることを表しています。
また、ジョブ一覧にプロセスIDをつけて表示したい時は、「jobs -l」コマンドになります。
ジョブの終了コマンド「kill」
ジョブを終了するときは、「kill %[ジョブ番号]」と入力します。
kill %1
killコマンドは、本来なら「プロセスにシグナルを送信してプロセスの制御を行うコマンド」です。
このコマンドを活用してジョブを終了させることが出来ます。
実際にkillコマンドでジョブを停止させた時は以下のよう表示となります。
ここまでで、ジョブについて以下の説明をしてきました!
- ジョブとは
- ジョブの状態遷移について
- 「停止」と「Ctrl + z」コマンド
- 「フォアグラウンド」と「fg」コマンド
- 「バックグラウンド」と「bg」コマンド
- ジョブの一覧の確認「jobs」コマンド
- ジョブの終了「kill」コマンド
ここまで読んでいただきありがとうございました!
コメント