「Ctrl+Zで止まってしまった処理を、ログアウトしても継続させたい」
Linuxでの作業中、時間のかかるコマンドをバックグラウンドで走らせたり、一時停止した処理を再開したりする場面はよくあります。このときに欠かせないのがジョブ制御の仕組みです。
この記事では、
jobs コマンドの実践的な使い方を解説します。ジョブの確認方法から、
fg/bg での切り替え、nohup や disown によるログアウト後の実行継続まで網羅しました。・バックグラウンド実行(&)とCtrl+Zでの一時停止
・fg / bg / kill によるジョブ制御の使い分け
・nohup / disown でログアウト後も処理を継続させる方法
・実務での典型パターン(vim一時退避→fgで復帰)
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
※本記事はbash前提です。zsh/fishでも基本動作は同じですが、ジョブ番号の指定書式が一部異なります。
ジョブとプロセスの違い
Linuxでは「プロセス」と「ジョブ」という2つの概念があります。・プロセス:OS全体で管理される実行単位。プロセスID(PID)で識別される。全てのプロセスに番号が振られる
・ジョブ:シェル(端末)単位で管理される実行単位。ジョブ番号で識別される。そのシェルから実行したコマンドだけが対象
つまり、ジョブはシェルのローカルな管理番号であり、プロセスはシステム全体の管理番号です。
バックグラウンド実行の基本(&)
コマンドの末尾に& を付けると、バックグラウンドで実行できます。シェルがすぐに戻ってくるので、別の作業を続けられます。# バックグラウンドでファイルをコピーする $ cp -r /var/log/ /tmp/backup/ & [1] 12345 # [1]がジョブ番号、12345がプロセスID
jobsコマンドの基本的な使い方
1. ジョブの一覧を表示する
jobs コマンドで、現在のシェルで実行中・停止中のジョブを一覧表示できます。$ jobs [1] Running cp -r /var/log/ /tmp/backup/ & [2]- Stopped vim /etc/httpd/conf/httpd.conf [3]+ Stopped top
・[番号]:ジョブ番号
・+:カレントジョブ(fg や bg をジョブ番号なしで実行した場合の対象)
・-:直前のジョブ
・Running:バックグラウンドで実行中
・Stopped:一時停止中(Ctrl+Zで停止された状態)
・Done:実行完了
2. プロセスID付きで表示する(-l)
-l オプションを付けると、ジョブ番号に加えてプロセスIDも表示されます。$ jobs -l [1] 12345 Running cp -r /var/log/ /tmp/backup/ & [2]- 12400 Stopped vim /etc/httpd/conf/httpd.conf [3]+ 12450 Stopped top
kill コマンドでプロセスを終了したい場合は、ここで表示されるPIDを使います。fg・bgコマンドでジョブを切り替える
1. fgでフォアグラウンドに戻す
fg コマンドで、バックグラウンドや停止中のジョブをフォアグラウンドに戻せます。# ジョブ番号2をフォアグラウンドに戻す $ fg %2 vim /etc/httpd/conf/httpd.conf # カレントジョブ(+マーク)をフォアグラウンドに戻す $ fg
2. bgでバックグラウンド実行を再開する
Ctrl+Zで停止したジョブを、バックグラウンドで再開するにはbg を使います。# 時間のかかるコマンドを実行中に Ctrl+Z で停止 $ find / -name "*.log" -size +100M ^Z [1]+ Stopped find / -name "*.log" -size +100M # バックグラウンドで再開する $ bg %1 [1]+ find / -name "*.log" -size +100M &
3. Ctrl+Z → bg のよくある流れ
「フォアグラウンドで実行してしまったけど、時間がかかるのでバックグラウンドに回したい」という場面で使う定番の操作です。1.
Ctrl+Z でジョブを一時停止する2.
bg でバックグラウンドで再開する3. 別の作業をする
4. 必要に応じて
fg でフォアグラウンドに戻すログアウト後もジョブを継続する方法
1. nohupで実行する
通常、シェルからログアウトするとバックグラウンドジョブも終了します。nohup(no hang up)を付けると、ログアウト後も処理が継続します。# nohupでバックグラウンド実行する $ nohup ./backup.sh & nohup: ignoring input and appending output to 'nohup.out' # 出力はnohup.outに保存される
# 出力先をログファイルに指定する $ nohup ./backup.sh > /var/log/backup.log 2>&1 &
2. disownでジョブをシェルから切り離す
既にバックグラウンドで実行中のジョブを、あとからシェルから切り離したい場合はdisown を使います。# バックグラウンドで実行中のジョブを確認する $ jobs [1]+ Running ./long-process.sh & # ジョブをシェルから切り離す $ disown %1 # jobsに表示されなくなる(プロセスは継続中) $ jobs (何も表示されない)
nohup は実行前に付ける、disown は実行後に使う、と覚えておくと使い分けがしやすいです。ジョブ番号の指定方法
fg、bg、kill などでジョブを指定するときは、以下の記法が使えます。・%1:ジョブ番号1を指定
・%+:カレントジョブ(+マーク)を指定。
%% でも同じ・%-:直前のジョブ(-マーク)を指定
・%文字列:コマンド名が一致するジョブを指定(例:
%vim)# ジョブ番号で強制終了する $ kill %1 # コマンド名でフォアグラウンドに戻す $ fg %vim
トラブルシュート・エラー対処
「-bash: fg: no job control in this shell」
このエラーは、ジョブ制御が無効になっているシェルでfg や bg を実行した場合に発生します。主な原因は以下の通りです。
・非対話的シェル(シェルスクリプト内など)で実行している
・
set +m でジョブ制御が明示的に無効化されている・
su でログインシェルを使わずにユーザーを切り替えた(su - ではなく su)対処法として、
su -(ハイフン付き)でユーザーを切り替えるか、ジョブ制御を有効にしてください。# ジョブ制御を有効にする $ set -m
「-bash: fg: %1: no such job」
指定したジョブ番号が存在しません。jobs で現在のジョブを確認してください。ジョブが完了済みの場合もこのエラーが出ます。fgコマンド徹底解説(停止中のジョブを前面に呼び戻す)
fg(foreground)は、停止中・バックグラウンド実行中のジョブをフォアグラウンド(端末の前面)に戻すコマンドです。jobsでジョブ番号を確認し、fg %番号で呼び戻すのが基本パターンです。fgの基本書式
# 直前のジョブを前面に戻す(番号省略可) $ fg # ジョブ番号1を前面に戻す $ fg %1 # 「vim」で始まる名前のジョブを前面に戻す $ fg %vim
典型的な使い方:vim作業をCtrl+Zで一時退避→fgで復帰
viやvimで編集中に「ちょっとシェルでファイル一覧を確認したい」となった時、Ctrl+Z でvimを一時停止できます。停止後、シェルで作業を済ませてからfgで元のvimに戻る流れは、現場のエンジニアが日常的に使うテクニックです。$ vim /etc/httpd/conf/httpd.conf (Ctrl+Z を押して一時停止) [1]+ Stopped vim /etc/httpd/conf/httpd.conf $ ls -la /etc/httpd/conf.d/ ←シェルで別作業 ... $ fg ←vimに復帰 vim /etc/httpd/conf/httpd.conf
fg と bg の違い
・fg:停止中/バックグラウンドのジョブを前面(フォアグラウンド)に戻す・bg:停止中のジョブをそのままバックグラウンドで再開する(プロンプトには戻らない)
Ctrl+Zで止めたコマンドを「画面に出さずに裏で実行を続けたい」場合は
bgを、「もう一度画面で操作したい」場合はfgを使うと覚えれば迷いません。本記事のまとめ
| やりたいこと | コマンド |
|---|---|
| バックグラウンドでコマンドを実行する | コマンド & |
| ジョブの一覧を表示する | jobs |
| プロセスID付きでジョブを表示する | jobs -l |
| ジョブをフォアグラウンドに戻す | fg %ジョブ番号 |
| 停止中のジョブをバックグラウンドで再開する | bg %ジョブ番号 |
| ログアウト後も処理を継続する | nohup コマンド & |
| 実行中のジョブをシェルから切り離す | disown %ジョブ番号 |
バックグラウンドジョブを安全にコントロールできていますか?
コマンドの使い方を一つひとつ覚えていくのは時間がかかります。
ネットの切れ端の情報をコピペするだけでなく、現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。
「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
登録10秒/合わなければ解除3秒 / 詳細はこちら
- 次のページへ:psコマンドでプロセスを確認する方法|auxと-efの違いやgrep検索も
- 前のページへ:historyコマンドでコマンド履歴を表示・検索する方法|日時表示や削除も
- この記事の属するカテゴリ:Linuxコマンド・LinuxコマンドF-J・プロセス管理コマンドへ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。
登録無料・いつでも解除できます