結論
先に結論を申し上げると Ctrl+Z
で一時停止し、bg
でジョブをバックグラウンドで再開するだけです。2つを続けて実行すればよいです。
フォアグラウンド処理をバックグラウンド処理に変更
現在のシェルのフォアグラウンドで実行中のコマンド処理を、処理を終了せずにバックエンドへ移動させる方法をまとめます。
nohup [コマンド] &
みたいにしてコマンドを実行することで、ログイン中のシェルから切り離してバックエンドで実行したりすると思います。現在フォアグラウンドで実行中のコマンド処理を nohup &
でくるんで実行している状態にする方法があります。
例えば100秒かかるシェルスクリプトがあったとします。このスクリプトを実行してしまったけどすぐにログアウトしないといけないとなった場合、以下のような手順で実行中の処理を終了せずにバックグラウンドに移行できます。もちろんログアウトしても処理が処理は継続してくれます。
手順
Ctrl + Z
でプロセスを一時停止bg
コマンドで一時停止中のプロセスをバックグラウンドへ
手順的には Ctrl + Z
を押下して、bg
コマンドを実行するだけです。複数のジョブが稼働中であれば bg
コマンド実行時に番号を指定する必要があります。
以下具体的なコマンドを実行しながら確認していきます。
時間がかかる処理
まず動作確認用に、処理時間がかかるコマンドを用意します。
#!/bin/bash
for data in `seq 100`
do
sleep 1
echo "$data `date`"
done
100秒カウントアップして echo
するシェルスクリプトです。わかりやすくするため、実行時間も確認できるように表示します。
これを my_script.sh
として実行します。
$ bash my_script.sh > log
# 100秒間処理が終わらない
echo
の内容は log
ファイルにリダイレクトしています。
Ctrl+Z: 処理を一時停止する
フォアグラウンドで実行中の処理を強制終了するのに Ctrl+C
を使いますが、Ctrl+Z
を使えば一時停止状態に移行させることができます。
フォアグラウンドで実行中の処理を Ctrl+Z
で一時停止状態にします。
$ bash my_script.sh > log
^Z
[1]+ Stopped bash my_script.sh > log
Ctrl+Z
を押下すると [1]+ Stopped
みたいな表示で実行中の bash my_script.sh > log
のジョブが一時停止になります。[1]
となっているのがジョブ番号です。
ここでは Ctrl+C
のように処理を強制的に終了しているのではなく、一時的に停止しているだけです。再開すれば一時停止した個所から処理が再開します。
現在のジョブは jobs
コマンドでも確認できます。
$ jobs
[1]+ Stopped bash my_script.sh > log
cat log
で確認すると以下のようにカウントアップの記録が実行時間とともに確認できます。
$ cat log
1 Sat Feb 20 20:43:00 JST 2021
2 Sat Feb 20 20:43:01 JST 2021
..
bg: ジョブをバックグラウンドで再開する
bg
コマンドを使えば指定のジョブをバックグラウンドで実行できます。ジョブ番号を指定して一時停止中のジョブをバックグラウンドで再開します。
$ bg 1
[1]+ bash my_script.sh > log &
これでバックグラウンドで処理が再開されます。
cat log
などで確認すると、ログでカウントが再開していることが確認できます。この状態だとログアウトしてもバックエンドで処理が続行します。ログアウト後再ログインして cat log
などで確認してみてください。ログアウト時も毎秒カウントアップしています。
一度ログアウトすると jobs
コマンドでは見えなくなりますが ps
コマンドで探せば見つかります。
以上。
コメントを書く