今回はLinuxにおけるジョブに関して紹介していきたいと思います。
ジョブはGUI環境では複数の端末が扱えるため、あまり恩恵を享受することはないです。
CLI環境だとジョブを理解していないと、操作しにくく不便な状況に陥る事がよくあります。
今回の記事ではそういったジョブの基本的な使い方と実行例を紹介していきたいと思います。
この記事でわかる事
ジョブに関する概要・基本的なコマンドについてわかります。
ジョブに関する豊富な実行例について理解し、使い方がわかります。
目次
ジョブについて
「ジョブ」とは シェル上でコンピュータに実行させる作業のまとまりを「ジョブ」と呼びます。
例えばコマンド1つ実行したとして、それがシェルでは一つのジョブと解釈されます。
ジョブはログインするユーザの端末セッションに依存しており、その端末を閉じたら見えなくなります。
下記画像は2つのシェルでジョブを共有していないということを示しております。
閉じたら消えています。
下記例では、ジョブ6542プロセスIDが存在しておりましたが、端末を閉じたら消えていることを示しています。
mitsu@miitsu-computer:~/デスクトップ$ jobs
[1]+ 実行中 tail -f /var/log/auth.log &
mitsu@miitsu-computer:~/デスクトップ$ jobs -l
[1]+ 6542 実行中 tail -f /var/log/auth.log &
mitsu@miitsu-computer:~/デスクトップ$
端末を閉じた結果....
mitsu@miitsu-computer:~/デスクトップ$ jobs -l
mitsu@miitsu-computer:~/デスクトップ$ ps aux | grep 6542
mitsu 6558 0.0 0.0 18824 736 pts/0 S+ 23:18 0:00 grep --color=auto 6542
mitsu@miitsu-computer:~/デスクトップ$
左端にある「1」という番号はジョブ番号と呼ばれます。
ジョブ番号は端末で動作しているシェルから実行されたジョブに付けられます。
端末からジョブを操作する際に使用します。
ジョブとプロセスの違い
コマンドを実行すると、シェル上でジョブとして解釈されます。それではプロセスとは何が違うのでしょうか?
プロセスはカーネルが管理しているのに対して、ジョブはシェルが管理しています。
Linuxカーネルはコマンドやアプリケーションなどをプロセスとして管理します。一方、シェルはコマンドラインに入力されたユーザからのコマンドを受け取り、それを1つの仕事の単位として扱います。
パイプラインの場合
コマンドラインで1つのコマンドを実行する、そのコマンドに対応するのは、1つのプロセスであり、1つのジョブです。
パイプラインやリストで複数のコマンドを実行する場合、プロセスは複数ですが、シェルの仕事の単位としては、1つのジョブとなります。
下記がその例となります。
プロセスとジョブの違い
mitsu@miitsu-computer:~/デスクトップ/permission$ tail -f /var/log/auth.log | wc &
[1] 2853
mitsu@miitsu-computer:~/デスクトップ/permission$
mitsu@miitsu-computer:~/デスクトップ/permission$ jobs
[1]+ 実行中 tail -f /var/log/auth.log | wc &
mitsu@miitsu-computer:~/デスクトップ/permission$
mitsu@miitsu-computer:~/デスクトップ/permission$ jobs -l
[1]+ 2852 実行中 tail -f /var/log/auth.log
2853 | wc &
mitsu@miitsu-computer:~/デスクトップ/permission$
このようにジョブとしては1まとまりですが、プロセスとしては別々として扱われます。
ジョブの実行モード
端末を立ち上げると同時にシェルが起動します。そのシェル上でコマンドを実行されるとジョブが管理されます。
ジョブにはフォアグラウンドとバックグラウンドの2つのモードがあります。
シェル上でコマンドを実行すると、ジョブとして実行され、それはフォアグラウンドとして実行されます。
フォアグランド概要
例えば 「tail -f 」コマンドを利用することにより特定のファイル名の更新状況をリアルタイムで表示してくれます。
ただこのコマンドはファイルの更新をリアルタイムで表示してくれますので、停止信号など送らないと表示し続けます。
またその間端末を操作することもできません。
ジョブが終了するまでそのシェル上では作業ができなくなります。作業が終わればプロンプトが返ってきます。
バックグラウンド概要
バックグランドはシェル上の作業を裏側で処理してくれます。
バックグランドで処理させることにより、シェルでの操作を継続し続けられます。
フォアグランドのみだと、作業が長いコマンドが終わるまで作業ができなくなります。
そういった場合はバックグランドジョブとしてコマンドを実行します。
コマンドをバックグラウンドとして実行する事により、作業は裏側で実行しつづけて、終わったらそのジョブは自動的に消えます。
ただコマンド結果は端末上に表示されるので、ファイルに出力させたいのであれば、別途ファイルに出力するなど工夫が必要です。
ジョブ操作するコマンドについて
それではジョブを扱うコマンドについて紹介していきます。
主に利用するコマンド
jobs:シェル上のジョブを表示します。
fg:ジョブをフォアグランドジョブとして実行します。
bg:ジョブをバックグラウンドジョブとして実行します。
これらのコマンドをジョブ操作するにあたり利用します。
それでは、コマンドの概要を紹介していきます。
jobs:ジョブを表示するコマンド
シェル上のジョブを表示するコマンドです。複数のシェルを開いた場合でも、それぞれのシェルにジョブは共有されません。
書式
jobs [オプション] [ジョブ番号]
オプション
オプション | 説明 |
-p | 実行中のバックグラウンドのプロセスIDを表示します |
-l | ジョブの詳細情報を表示します |
fg:ジョブをフォアグランドで実行します
ジョブをフォアグランドで実行します。
書式
fg [ジョブ番号]
bg:ジョブをバックグラウンドで実行します
ジョブをバックグラウンドで実行します。
書式
bg [ジョブ番号]
実行例
それではジョブ操作していく上で、実行例を紹介していきます。
ジョブ確認
現在のジョブの実行状況を見るには「jobs」コマンドを使用します。
合わせて見方も説明します。
jobsコマンド実行結果
mitsu@miitsu-computer:~/デスクトップ/permission$ tail -f /var/log/auth.log &
[1] 3116
mitsu@miitsu-computer:~/デスクトップ/permission$
mitsu@miitsu-computer:~/デスクトップ/permission$ jobs -l
[1]+ 3116 実行中 tail -f /var/log/auth.log &
mitsu@miitsu-computer:~/デスクトップ/permission$
記載がある[1]がジョブ番号です。ジョブ番号の後にある「+」記号は直近に実行しているジョブまたはジョブで、「ー」は一個前の実行しているジョブとなります。
その後にある「9078」がプロセスIDとなります。
フォアグランドとしてジョブ実行
コマンドは通常実行するとフォアグランドとして処理されます。
ただ停止中のジョブをフォアグランドに移行するには「fg」コマンドを利用します。
「fg」コマンドの後にジョブ番号を入力します。
fg実行結果
mitsu@miitsu-computer:~/デスクトップ$ fg 1
tail -f /var/log/auth.log
このようにすると端末で「tail」 コマンドがフォアグランドで実行されます。停止中のジョブをフォアグランドにしたい時に使用します。
バックグランドのジョブとして実行
コマンドをバックグランドで実行するには、コマンドの後に「&」をつける必要がります。
また停止中のジョブを「bg」コマンドを利用することでバックグラウンドジョブとして再開させることができます。
バックグラウンドとして実行
mitsu@miitsu-computer:~/デスクトップ$ tail -f /var/log/auth.log &
[1] 10288
これによりバックグランドで実行されるようになります。
停止中ジョブをバックグラウンドとして実行は下記となります。
停止中のジョブをバックグラウンドとして実行
tail -f /var/log/auth.log
^Z
[1]+ 停止 tail -f /var/log/auth.log
mitsu@miitsu-computer:~/デスクトップ$
mitsu@miitsu-computer:~/デスクトップ$ jobs
[1]+ 停止 tail -f /var/log/auth.log
mitsu@miitsu-computer:~/デスクトップ$ bg 1
[1]+ tail -f /var/log/auth.log &
mitsu@miitsu-computer:~/デスクトップ$ jobs
[1]+ 実行中 tail -f /var/log/auth.log &
mitsu@miitsu-computer:~/デスクトップ$
nohupコマンドによるシェル閉じた後でも実行
シェルを閉じたらそのシェルのジョブは消えます。
その際に利用するのがnohupコマンドです。端末を閉じてもログアウトしても処理を続けるコマンドです。
これによりそのシェルを閉じても実行し続けます。プロセスとして処理させたい場合に利用します。
試しにsleepコマンドで1000秒、バックグラウンドで処理してみます。
そうすると、psコマンドでバックグランドで処理されていることが確認できます。
nohup実行結果
root@miitsu-computer:/home/mitsu/デスクトップ# nohup sleep 1000 &
[1] 6204
root@miitsu-computer:/home/mitsu/デスクトップ# nohup: 入力を無視し、出力を 'nohup.out' に追記します
root@miitsu-computer:/home/mitsu/デスクトップ# jobs -l
[1]+ 6204 実行中 nohup sleep 1000 &
root@miitsu-computer:/home/mitsu/デスクトップ#
root@miitsu-computer:/home/mitsu/デスクトップ# ps aux | grep 6204
root 6204 0.0 0.0 17852 520 pts/1 S 19:00 0:00 sleep 1000
root 6208 0.0 0.0 18824 736 pts/1 S+ 19:01 0:00 grep --color=auto 6204
root@miitsu-computer:/home/mitsu/デスクトップ#
ジョブの再開
フォアグランドでの再開
停止中のジョブをフォアグランドへ再開させるには「fg」コマンドを使用します。
ジョブ番号はjobsコマンドでジョブ番号を確認します。
fg再開実行結果
mitsu@miitsu-computer:~/デスクトップ/permission$ jobs
[1]+ 停止 tail -f /var/log/auth.log
mitsu@miitsu-computer:~/デスクトップ/permission$
mitsu@miitsu-computer:~/デスクトップ/permission$ fg 1
tail -f /var/log/auth.log
バックグランドでの再開
停止中のジョブをバックグランドへ再開させるには「bg」コマンドを使用します。
bg実行結果
mitsu@miitsu-computer:~/デスクトップ/permission$ jobs
[1]+ 停止 tail -f /var/log/auth.log
mitsu@miitsu-computer:~/デスクトップ/permission$ bg 1
[1]+ tail -f /var/log/auth.log &
Jan 20 22:30:01 miitsu-computer CRON[3199]: pam_unix(cron:session): session opened for user root by (uid=0)
Jan 20 22:30:01 miitsu-computer CRON[3199]: pam_unix(cron:session): session closed for user root
mitsu@miitsu-computer:~/デスクトップ/permission$
mitsu@miitsu-computer:~/デスクトップ/permission$ jobs
[1]+ 実行中 tail -f /var/log/auth.log &
mitsu@miitsu-computer:~/デスクトップ/permission$
フォアグランド同様にjobsコマンドにてジョブ番号を確認し、bgコマンドでジョブIDを指定して再開させます。
今回はジョブIDが[1]だったので、「bg 1」と入力し停止中のジョブを再開させます。
ジョブを終了・停止するには
ジョブを終了するにはjobsコマンドでジョブIDまたは「jobs -lまたは-p」で対象ジョブのプロセスIDを調べます。
これに対してkillコマンドを使用し、対象ジョブまたはプロセスを終了させることができます。
さらにフォアグランドのジョブであれば強制終了といった形で「ctrl+C」 による強制終了ができます。
ジョブID
「jobs」コマンドで終了させたいジョブの番号を確認後、「kill % ジョブ番号」でジョブを終了させることができます。例えば「kill %1」でジョブ番号1を終了させることができます。
ジョブID終了
mitsu@miitsu-computer:~/デスクトップ/permission$ jobs
[1]+ 実行中 tail -f /var/log/auth.log &
mitsu@miitsu-computer:~/デスクトップ/permission$ kill %1
mitsu@miitsu-computer:~/デスクトップ/permission$ jobs
[1]+ Terminated tail -f /var/log/auth.log
mitsu@miitsu-computer:~/デスクトップ/permission$
mitsu@miitsu-computer:~/デスクトップ/permission$
プロセスID
「jobs -l」コマンドでプロセスIDを特定します。その後
「jobs -l」でプロセスID特定して、killコマンドでプロセスを終了させます。
プロセスID表示
mitsu@miitsu-computer:~/デスクトップ$ jobs -l
[1]+ 10412 実行中 tail -f /var/log/auth.log &
mitsu@miitsu-computer:~/デスクトップ$
ここに表示されている数字「10421」はプロセスIDとなります。
そのため「kill 10421」を指定して実行すればそのジョブ(プロセス)は問題なければ消えます。無事終了すれば「terminated」と表示されます。jobsコマンドで実行後一度だけ表示されます。
プロセスID終了
mitsu@miitsu-computer:~/デスクトップ$ jobs -l
[1]+ 10421 実行中 tail -f /var/log/auth.log &
mitsu@miitsu-computer:~/デスクトップ$ kill 10421
mitsu@miitsu-computer:~/デスクトップ$ jobs -l
[1]+ 10421 Terminated tail -f /var/log/auth.log
mitsu@miitsu-computer:~/デスクトップ$
ジョブを停止するには
実行中のフォアグランドのジョブを停止するには「ctrl+Z」で行うことができます。
バックグラウンドのジョブは一度フォアグランドに戻して行うことが必要となります。
成功すれば、下記のように停止になります。
ジョブ停止実行結果
u@miitsu-computer:~/デスクトップ$ fg 1
tail -f /var/log/auth.log
^Z
[1]+ 停止 tail -f /var/log/auth.log
mitsu@miitsu-computer:~/デスクトップ$
まとめ
今回の記事はいかがだったでしょうか?
まとめに入ります。
まとめ
・ジョブはコマンドやプロセスのかたまりです。
・ジョブにはファアグランドとバックグランドがある
・フォアグランドは実行中操作できないが、バックグランドは裏でプログラムの実行をしてくれるため操作できます。
・ジョブを削除するにはジョブ番号を指定して削除する方法とプロセスIDを指定して削除することができます。
以上となります。
ジョブは使いこなすと便利ですし、フォアグランドの状態で待ち時間を短縮できるテクニックですので、ぜひ覚えていってください。
例えば何かをダウンロードする時に待ち時間が長いパッケージなどであればバックグランドとすることで、ユーザは操作を中断されることなく、その操作することができます。
当メディアにはLinuxなどに関する記事を執筆しているので、よろしければぜひご覧ください。