はじめに
Linuxで長時間かかるスクリプトやコマンドを実行しているとき、誤って Ctrl+Z を押してしまい、処理が停止してしまった経験があった。
いつも、仕方ないので psコマンドでプロセスIDを調べて kill -9 <PID> で強制終了し、再度スクリプトを実行していたが、実は停止したジョブを再開する方法があることを知った。
今回は、Ctrl+Z で停止(サスペンド)させたジョブを再開する方法についてまとめる。
環境
WSL2 (Ubuntu 24.04 LTS)
Bash 5.2.21Ctrl+Z と Ctrl+C の違い
普段何気なく使っているショートカットだが、裏側では「シグナル」という仕組みが動いている。Ctrl+Z とよく似た操作に Ctrl+C があるが、これらは送信するシグナルと挙動が明確に異なる。
| 特徴 | Ctrl+Z (SIGTSTP) | Ctrl+C (SIGINT) |
|---|---|---|
| シグナル | SIGTSTP (Terminal Stop) | SIGINT (Interrupt) |
| 動作 | プロセスを一時停止(サスペンド)する。 | プロセスに割り込み(中断)を要求する。 |
Ctrl+Z (SIGTSTP) の詳細
状態
プロセスはメモリ上に残ったまま、CPUの割り当てが止まった状態になる。用途
処理を一時中断したいときや、フォアグラウンドで実行してしまった処理をバックグラウンドに移行させたいときなどに使う。
今回紹介するfgやbgで操作できるのはこの状態のプロセスとなっている。
Ctrl+C (SIGINT) の詳細
状態
多くのプログラムは、このシグナルを受け取ると直ちに終了処理を行い、プロセスが消滅する。用途
実行中のプログラムを強制的に止めたい(キャンセルしたい)ときに使う。
一度終了すると、基本的には途中から再開することはできない。
つまり、「後で再開したい」なら Ctrl+Z、「完全に止めたい」なら Ctrl+C という使い分けになる。
今回は、Ctrl+Z で停止したジョブを再開する方法について解説する。
使い方
サンプルスクリプトの準備
まずは動作確認用に、1秒ごとに現在時刻を表示し続ける簡単なスクリプト loop.sh を作成する。
#!/bin/bash
while true; do
date
sleep 1
done実行権限を付与しておく。
chmod +x loop.shスクリプトの実行と停止
スクリプトを実行する。
./loop.shログ
Wed Dec 24 16:31:22 JST 2025
Wed Dec 24 16:31:23 JST 2025
Wed Dec 24 16:31:24 JST 2025
Wed Dec 24 16:31:25 JST 2025実行中に Ctrl+Z を押すと、以下のように表示されてプロセスが停止する。
^Z
[1] + 8319 suspended ./loop.shジョブの確認
停止中のジョブは jobs コマンドで確認できる。
jobs出力
[1] + suspended ./loop.sh[1] はジョブ番号を表している。
フォアグラウンドで再開する (fg)
停止したジョブをフォアグラウンド(元の状態)で再開するには、fg コマンドを使用する。
引数なしで実行すると、直近のジョブ(+がついているもの)が再開される。
fg実行すると以下のように表示される。
[1] + 8319 continued ./loop.sh
Wed Dec 24 16:32:18 JST 2025
Wed Dec 24 16:32:19 JST 2025
Wed Dec 24 16:32:20 JST 2025
Wed Dec 24 16:32:21 JST 2025
Wed Dec 24 16:32:22 JST 2025特定のジョブ番号を指定して再開することもできる。
%1 はジョブ番号1を指す。
fg %1バックグラウンドで再開する (bg)
停止したジョブをバックグラウンドで再開させたい場合は、bg コマンドを使用する。
これにより、ターミナルを占有せずに処理を継続させることができる。
bg実行すると、バックグラウンドで処理が再開される。
今回のスクリプトの場合、ターミナルに標準出力が表示される。
バックグラウンドで実行中のジョブも jobs コマンドで確認できる。
jobs出力例
[1] + running ./loop.shバックグラウンドジョブをフォアグラウンドに戻したい場合は、再度 fg コマンドを使えばよい。
バックグラウンド実行時の出力について
bg コマンドで再開した後も、ターミナルに文字が出力され続けることがある。
これは、プロセスはバックグラウンドで動いているが、標準出力先がターミナルのままになっているためだ。
この状態でも、ターミナルの入力(標準入力)はシェルが受け付けているため、コマンドを打つことは可能である。
ただし、表示が混ざって見づらくなるため、出力が多いコマンドをバックグラウンドで動かす場合は、最初から出力をファイルにリダイレクトしておくか、/dev/null に捨てておくのが望ましい。
参考
GNU Bash Reference Manual - Job Control
https://www.gnu.org/software/bash/manual/html_node/Job-Control.htmlLinux manual page - signal(7)
https://man7.org/linux/man-pages/man7/signal.7.html
おわりに
Ctrl+Z で停止してしまった場合でも、慌てずに fg や bg を使えば復帰できる。
特に長時間かかる処理をバックグラウンドに回したい場合、一度実行してから Ctrl+Z -> bg という手順は頻繁に使うので覚えておくとよさそう。