[Linux] 実行中のコマンドをバックエンド処理(nohup)にする

[Linux] 実行中のコマンドをバックエンド処理(nohup)にする

結論

先に結論を申し上げると Ctrl+Z で一時停止し、bg でジョブをバックグラウンドで再開するだけです。2つを続けて実行すればよいです。

フォアグラウンド処理をバックグラウンド処理に変更

現在のシェルのフォアグラウンドで実行中のコマンド処理を、処理を終了せずにバックエンドへ移動させる方法をまとめます。

nohup [コマンド] & みたいにしてコマンドを実行することで、ログイン中のシェルから切り離してバックエンドで実行したりすると思います。現在フォアグラウンドで実行中のコマンド処理を nohup & でくるんで実行している状態にする方法があります。

例えば100秒かかるシェルスクリプトがあったとします。このスクリプトを実行してしまったけどすぐにログアウトしないといけないとなった場合、以下のような手順で実行中の処理を終了せずにバックグラウンドに移行できます。もちろんログアウトしても処理が処理は継続してくれます。

手順

  1. Ctrl + Z でプロセスを一時停止
  2. 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 コマンドで探せば見つかります。

以上。

Linuxカテゴリの最新記事