ジョブとは、コマンドやプログラムがまとまった、ひとかたまりの処理のことだ。
このページではLinuxのジョブ操作についてまとめている。基本的なことがまとまっているので、ジョブについて知りたいという方には参考になるだろう。
目次
ジョブとは?
ジョブ
ジョブとは端末ごとに見た一連の処理のことだ。下記はすべてジョブにあたる。
$ command
$ (command; command)
$ command && command
プロセスが1つもしくは複数集まって1つのジョブができているイメージだと思ってほしい。
フォアグランドジョブとバックグランドジョブ
2種類のジョブ
ジョブには2種類ある。フォアグラウンドジョブとバックグランドジョブだ。
「フォアグランド」とは「前景」という意味になる。反対に「バックグランド」は「背景」という意味だ。
簡単な見分けかたとしては、「今操作しているアプリケーションはフォアグランドジョブ」それ以外は「バックグランドジョブ」である。
マルチタスクなのに意味あるの?
現代ではコンピュータは「マルチタスク」であることが当たり前になっている。複数の処理を同時に行うことができるわけだ。
では何故いちいち、フォアグランドジョブ、バックグランドジョブなどと分けてよんでいるのかというと「人間がシングルタスクだから」である。
例えば右の目と左の目で別々に読書することは出来ないはずだ。本を読むときは一冊ずつだ。例え複数の本を読書しようとしても、読む瞬間は一冊ずつしか読めない。
また絶対ではないがフォアグランドジョブは対話的であることが多いのに対して、バックグランドジョブは非対話的だ。
フォアグランドジョブを切り替える場合は、いったん処理を停止、もしくはバックグランドジョブとして移行させてから他の処理をフォアグランドに持っていくことになる。
WindowsなどをはじめとしたGUIなOSや、Linuxでもデスクトップ環境を搭載している場合、ウィンドウを頻繁に切り替えているはずだ。
少々広義な意味になるかもしれないが、これはフォアグランドジョブとバックグランドジョブとを、あなたは意識しないで切り替えていることになる。
CUI環境では?
ではCUI環境ではどうだろう? コンソール画面ではシェルと対話することになるが、一つのタスクを走らせ、作業をしているときに、もう一つタスクをコンピュータにお願いしたくなった場合どうするのか?
実行中のフォアグランドジョブを中止しなければならないのか?
安心してほしい。
その場合、一時停止してバックグランドにジョブを引渡し、バックブランドで処理再開、フォアグランドで他の作業に移行することができるようになっている。
もちろん最初からバックグランド処理としてジョブを走らせることも可能だ。GUI環境だとあたりまえな操作だがCUIだと少々とまどうかもしれないが実際にやってみて感覚をつかんでほしい。
実際にやってみよう
GUIの場合
GUIデスクトップ環境の場合非常に直感的である。
現在フォアグランドなのは「FireFox」でバックグランドなのは「端末」ということになる。フォアグランドジョブは常に一つだ。それ以外はバックグランドという扱いになる。
CUIの場合
今回のページは主にこのCUIでの操作説明がメインの部分だ。コンソールもしくは端末を立ち上げて実験してみてほしい。
簡単な例をあげると
$ sleep 1000
などとしてみる。
すると現在フォアグランドジョブとして「sleep」つまり「何もせずに待ってくれ」というコマンドを実行する。
今回は1000秒待ってくれという命令だ。しかしこれではフォアグランドはsleepコマンド実行中のため1000秒間何もできない。
そこでsleepコマンドを「バックグランドでお仕事をしてもらう」ことにする。とりあえず「Control+z」を押してみてほしい、すると以下の様になるはずだ。
「処理が一時停止」する。次に
$ jobs
とコマンドを実行する。いま一時停止しているジョブとその番号が表示されるはずだ。
そうしたら「bg」コマンドで処理をバックグランドに引きわたすことができる。次のように叩いてみていただきたい。
$ bg %<job番号>
とすると、指定した処理がバックグランド処理へと切り変わる。
今回はジョブ番号1番を指定している。
逆にバックグランドジョブをフォアグランドジョブとして処理してほしいときは「fg」コマンドを使う、jobsコマンドでジョブ番号を確認「fg %<job番号>」で処理がフォアグランドへ引き渡される。
$ fg %<job番号>
なお実行したいコマンドのあとに「&」をつけるとそのコマンドはバックグランドジョブとして処理される。例えば
$ sleep 1000 &
などだ、バックグランドで走っている処理はjobsコマンドもしくはpsコマンドで確認できる。
ちなみにfgコマンドとbgコマンドはシェルの組み込みコマンドであり、シェル自身がもっているコマンドである。
なので/binや/usr/binなどにコマンドがあるわけではないことに注意していただきたいちなみにjobsコマンドに「-l」 をつけるとプロセスIDを表示してくれる。
$ jobs -l
jobsコマンドオプション
jobsコマンドの各種オプションもご紹介しておこう。動いているjobが多ければオプションを使用してフィルタリングをすればいい。
- -l プロセスIDを含めて表示する
- -p プロセスIDのみ表示する
- -r 実行中のジョブのみ表示する
- -s 停止中のジョブのみ表示する
実行中のジョブを停止するには?
いくつか方法があるが、まずはひとつだけ知っておけばいいだろう。
killコマンドというものがあり、
$ kill %<job番号>
を用いることでジョブは停止できる。プロセスなどと一緒で、root以外では他人のジョブを停止することはできない。
まとめ
このページではLinuxのジョブ操作方法についてまとめてきた。
updatedbなど時間がかかるコマンドであればバックグランドで動かすことを癖にしておこう。
コメント