Linuxコマンドのバックグラウンド「&」をわかりやすく
シェルプロンプトで、コマンドの後ろに&
をつけるとバックグラウンドで実行されます。
重たい処理はバックグラウンドで実行すると、裏で勝手に実行されてシェルプロンプトはすぐに戻ってきます。
jobsコマンド
バックグラウンドで実行されているジョブを確認することができます。
バックグラウンドで実行していない場合はjobsコマンドを実行しても何もありません。
[ec2-user@humidai ~]$ jobs [ec2-user@humidai ~]$
50秒待機するsleepコマンドをバックグラウンドで実行してみます。
[ec2-user@humidai ~]$ jobs [ec2-user@humidai ~]$ sleep 50 & [1] 22586 [ec2-user@humidai ~]$ jobs [1]+ 実行中 sleep 50 & [ec2-user@humidai ~]$ jobs [1]+ 終了 sleep 50 [ec2-user@humidai ~]$ jobs
バックグラウンドで実行した後にjobsコマンドを実行すると、バックグラウンドで実行されているジョブ一覧が表示されました。
[1]がジョブ番号、22586がプロセスになります。
サブシェルをバックグラウンドで実行する
サブシェルをバックグラウンドで実行することも可能です。()のあとに&をつけるだけです。
[ec2-user@humidai ~]$ (sleep 5; echo 'test') & [1] 23753 [ec2-user@humidai ~]$ test [1]+ 終了 ( sleep 5; echo 'test' ) [ec2-user@humidai ~]$
ジョブの終了
バックグラウンドジョブの終了は、Enterを押します。
3秒待機するsleepコマンドをバックグラウンドで実行します。
[ec2-user@humidai ~]$ sleep 3 & [1] 23942 [ec2-user@humidai ~]$ [ec2-user@humidai ~]$ [1]+ 終了 sleep 3 [ec2-user@humidai ~]$
何回かEnterキーを押していたら、終了していたらジョブ終了と出力されます。
ただEnterキーを押すのが面倒です。リアルタイムに終了を通知させたい場合はsetコマンドを使用します。
set -o notify
(set -b
)コマンドを実行してから、バックグラウンドで実行すると、終了と同時に通知が勝手にされるようになります。
[ec2-user@humidai ~]$ sleep 3 & [1] 24693 [ec2-user@humidai ~]$ [1]+ 終了 sleep 3 [ec2-user@humidai ~]$
ジョブとプロセスの違い
Linuxでジョブとプロセスという考えがあります。
プロセスはプログラムの実行単位のことで、ジョブはシェル実行単位という感じです。
[ec2-user@humidai ~]$ (sleep 3; echo 'test') & [1] 355
複数プロセスで1ジョブというイメージです。
KHI入社して退社。今はCONFRAGEで正社員です。関西で140-170/80~120万から受け付けております^^
得意技はJS(ES6),Java,AWSの大体のリソースです
コメントはやさしくお願いいたします^^
座右の銘は、「狭き門より入れ」「願わくは、我に七難八苦を与えたまえ」です^^
コメント