🐻

ジョブをバックグラウンドにしたりフォアグラウンドにしたりkillしたり

2021/01/02に公開

はじめに

くーばねてすをやっつけるためにLinuxさんと仲良くしはじめた。どうやらLinuxを繋ぐシェルさんにもプロセスみたいなのがあることが判明した。ジョブというらしい。ジョブってなんだ?くーばねてす倒す。

概要

■ ジョブとは
■ 現在のジョブ一覧を表示する
■ 現在のジョブ一覧とプロセスIDを表示
■ bgコマンド~コマンドの実行をバックグラウンド状態にする~
■ バックグラウンド処理ワンライナーで早いの
■ ジョブを停止させるには
■ プロセスを終了するには

ジョブとは

じつはさっきのプロセスはLinuxのカーネル(OSの中核部分に位置するソフトウェア)さんから見た時の処理の単位だった。これに対しシェル(ターミナル)から見た時の単位をジョブという。
コマンドライン1行に対して、1つのジョブになる。

$ ls -l / | cat -n | less

↑は生成されるプロセスは3つだが、ジョブは1つ
プロセスはシステム全体で一つの一意のプロセスIDを持つが、ジョブはシェルごとにジョブ番号を持つので複数のターミナルを開いているときはジョブ番号も重複する。

$ ls -l
$ man bash
$ vim ~/.bashrc

↑ジョブは3つ、プロセスも3つ

現在のジョブ一覧を表示する

Linuxさんでは現在のジョブの状態を確認することができる。
試しに~/.bashrcをvimで編集しコマンドを一時停止にしてみる。(vim編集中にCtrl+z)

$ jobs
[1]+ Stopped                 vim .bash

[1]はジョブの番号を表す。
左から二番目の「+」「-」は「+」がカレントジョブ、「-」がひとつ前のジョブを表す。
カレントジョブはジョブ番号を指定しないで「bg」コマンドや「fg」コマンドを実行した際に、処理対象となる。

現在のジョブ一覧とプロセスIDを表示

$ jobs -l
[1]+ 10540 Stopped                 vim .bashrc

fgコマンド~さっき一時停止したのを復活させる~

さっき一時停止したのを復活させる、つまりフォアグラウンドにするには、fgコマンドを使う。

$ fg %ジョブ番号

さっきのvimを復活させたかったらまずはジョブ番号を確認し、番号を確認後にfgコマンドを実行する。

$ jobs
[1]+ Stopped                 vim .bashrc
$ fg %1
vim .bashrc

さっきのvim編集状態に戻った!
fgだけを入力するとカレントジョブ(+のやつ)が復活する。jobsで検索した一番うえのやつ。
停止にする直前の状態に戻るので、複数のコマンドを操作する時に使えるかも?

bgコマンド~コマンドの実行をバックグラウンド状態にする~

長い時間動作させたいジョブや処理に時間がかかるときにはジョブをバックグラウンドにすることができる。裏手で実行させるにはbgコマンドを使う。
手順としては、

コマンドを実行
↓
ジョブを停止
↓
bgコマンドでジョブをバックグラウンドで実行する

となる。
ジョブをbgコマンドでバックグラウンドで実行するには

$ bg %ジョブ番号

↓長くなりそうなコピーをバックグラウンドで実行してみる。

$  cp file1 file2
^z   (Ctrl+zを入力して一時停止)
[1]+ Stopped              cp file1 file2 &  
$ bg %1
$ jobs 
[1]+  Running             cp file1 file2

ジョブを確認したらcp file1 file2が実行中になった!

バックグラウンド処理ワンライナーで早いの

↓ちなみにワンライナーでバックグラウンド処理もできるw

コマンド オプションなど &

さっきのなら

$ cp file1 file2 & 

こっちの方が楽だからいいね!('_')

これらのジョブを停止させるには

ジョブを停止させるにはジョブの状態によってコマンドが変わる。

フォアグラウンドのときはコマンドを実行中に
Ctrl+c
バックグラウンドのときは
$ kill %ジョブ番号

でジョブを終了させる。

$ kill %1
[1]+  Stopped                 man bash
$ jobs
[1]+  Terminated              man bash

終了するとTerminatedと表示される。(終了済みという意味)
しばらくしてjobsコマンドで確認するとジョブが消えているのがわかる。

プロセスを終了するには

プロセスを終了するには

$ kill プロセスID

プロセスを終了するには%がつかなくなる。
プロセスを終了するのは実行ユーザに限られる。(あとスーパーユーザ)

まとめ

■フォアグラウンド
我々が操作しながら処理が実行されている状態
■バックグラウンド
操作せずに処理が行われている状態
■停止
処理を一時停止している状態

Ctrl+z,fgコマンド、bgコマンド(&で短縮もできるぞ)でジョブの状態を変えることができるぞ。
消すにはCtrl+cとkill!!!

Discussion