Linux管理・運用の基本
システム管理者のための実践ガイド
システム管理者のための実践ガイド
Linuxを日常的に利用していると、時間のかかるコマンドや、ターミナルを占有してしまうコマンドを実行する場面が多々あります。そんな時、コマンドをバックグラウンドで実行したり、実行中のジョブを効率的に管理したりする方法を知っていると、作業効率が格段に向上します。
この記事では、Linuxでのジョブ制御の基本を解説します。コマンドをバックグラウンドで実行する方法、実行中のジョブの状態を確認・制御する方法をマスターし、快適なLinux操作環境を手に入れましょう。
※この記事では、BashまたはZshなどの主要なシェル環境でのジョブ制御を前提に解説しています。shやcsh系のシェルでは、一部コマンドや挙動が異なる場合がありますのでご注意ください。
時間のかかる処理や、ターミナルをブロックしたくない場合に、コマンドをバックグラウンドで実行できます。
& をつけるコマンドの末尾に & をつけることで、そのコマンドはバックグラウンドで実行され、すぐにプロンプトが返ってきます。
例:
sleep 60 &
sleep コマンドを60秒間実行しますが、このコマンドはすぐにバックグラウンドに送られるため、ターミナルは次の操作を受け付けます。すでに実行してしまったコマンドをバックグラウンドに送りたい場合は、以下の手順で行います。
Ctrl + Z を押します。これにより、コマンドが一時停止 (Stop) します。bg コマンドを実行します。一時停止したコマンドがバックグラウンドで再開されます。例:
# sleep 60 を実行中に Ctrl + Z を押す
sleep 60
# ここで Ctrl + Z
^Z
[1]+ Stopped sleep 60
# バックグラウンドで再開する
bg
[1]+ sleep 60 &
バックグラウンドで実行中のコマンドは「ジョブ」として扱われます。これらのジョブは jobs コマンドで確認・制御できます。
jobsjobs コマンドは、現在シェルで実行されているジョブの一覧を表示します。
例:
jobs
表示例:
[1]- Running sleep 60 &
[2]+ Stopped vim test.txt
[1] や [2] はジョブ番号です。これらのジョブを操作する際は、多くの場合 % をつけて %ジョブ番号
の形式で指定します(例: fg %1)。+ は現在のジョブ、- は次に実行されるジョブを示します。Running は実行中、Stopped は停止中を示します。また、jobs -l を使うと、各ジョブのPID(プロセスID)も同時に表示できます。
jobs -l
fgバックグラウンドで実行中のジョブをフォアグラウンド(ターミナルで直接操作できる状態)に戻したい場合は fg コマンドを使います。
例:
fg %1
1 のジョブをフォアグラウンドに戻します。ジョブ番号を省略すると、+ がついている現在のジョブがフォアグラウンドに戻ります。bgCtrl + Z で停止したジョブをバックグラウンドで再開するには bg コマンドを使います。
例:
bg %2
2 のジョブをバックグラウンドで再開します。ジョブ番号を省略すると、+ がついている現在のジョブがバックグラウンドで再開されます。kill特定のジョブを終了させたい場合は、kill コマンドにジョブ番号を指定します。
例:
kill %1
1 のジョブに関連するプロセスを終了させます。nohup と disownターミナルを閉じたり、SSHセッションが切断されたりすると、通常、そのターミナルで実行されていたバックグラウンドジョブも終了してしまいます。これを防ぐには nohup または disown コマンドを使います。
nohup コマンドを使うnohup コマンドは、コマンドを起動する際に使用し、セッション切断後もプロセスを継続させたい場合に便利です。
例:
nohup long_running_script.sh &
long_running_script.sh というスクリプトを、セッションが切断されても実行し続けるようにバックグラウンドで起動します。nohup を使うと、標準出力と標準エラー出力はデフォルトで nohup.out というファイルにリダイレクトされます。明示的に出力先を指定することも可能です。nohup long_running_script.sh > mylog.txt 2>&1 &
mylog.txt に、標準エラー出力を標準出力と同じ mylog.txt にリダイレクトし、バックグラウンドで実行します。disown コマンドを使うすでにバックグラウンドで実行中のジョブを、後からセッションから切り離して継続させたい場合に disown を使います。これは Bash の組み込みコマンドです。特に、SSHでリモート作業中に「やっぱりセッションを閉じたいけど、このジョブは残したい」という状況で役立ちます。
例:
sleep 600 & # まずバックグラウンドで起動
disown %1 # ジョブ番号1のジョブをセッションから切り離す
sleep 600 をバックグラウンドで起動した後、そのジョブを現在のシェルセッションから切り離します。これにより、シェルが終了しても sleep 600 は終了せず実行を継続します。※disown 単体では、シェルの設定や環境によってはジョブが終了してしまう場合もあります。より確実にセッション切断後もプロセスを継続させたい場合は nohup と併用するか、disown -h で HUP
シグナルも無視させる方法も検討してください。
& をつけてバックグラウンド実行するか、実行中に Ctrl + Z で一時停止後、bg でバックグラウンドに送りましょう。jobs コマンドでジョブ番号を確認し、fg %ジョブ番号 でフォアグラウンドに戻しましょう。nohup コマンド & の形式で実行しましょう。disown %ジョブ番号 でセッションから切り離しましょう。screen や tmux などのターミナル多重化ツールも便利です(これらのツールの詳細は別の記事で解説します)。| コマンド | 役割・用途 |
|---|---|
& |
コマンドをバックグラウンドで実行 |
jobs |
現在実行中のジョブ一覧を表示 |
fg %ジョブ番号 |
指定したジョブをフォアグラウンドに戻す |
bg %ジョブ番号 |
停止中のジョブをバックグラウンドで再開 |
kill %ジョブ番号 |
指定したジョブに関連するプロセスを終了 |
nohup コマンド & |
セッション切断後もコマンドの実行を継続させる |
disown %ジョブ番号 |
実行中のジョブをシェルセッションから切り離す |
この記事では、Linuxにおけるジョブ制御の基本として、コマンドのバックグラウンド実行、ジョブの状態確認、フォアグラウンドへの切り替え、そしてセッション切断後も処理を継続させる nohup と disown
の使い方を解説しました。これらのコマンドを使いこなすことで、Linuxでの作業効率が向上し、より快適な運用が可能になります。
この記事が、Linuxのジョブ制御について理解を深める一助となれば幸いです。ご覧いただきありがとうございました。次回は、Linuxにおけるスワップ領域の確認と追加について解説します。