Help us understand the problem. What is going on with this article?

早く帰りたいのにリモートでコマンドを実行してしまった時に、バックグラウンド実行に変える方法

More than 3 years have passed since last update.

まだ実行前の場合

nohup でバックグランド実行

まだ実行前だったら大助かりです。
落ち着いて、 nohup で実行してすぐに逃れられます。

# コマンド上で実行の場合 or シェルスクリプトで実行の場合
$ nohup sh -c 'sleep 5; echo Success!' &
$ nohup sh test.sh &

別に大事なものじゃないけど、時間がかかるものでやるといいでしょう。

$ nohup sh -c 'docker run --rm=true --name update-qa-db --env-file=/home/core/.env  quay.io/koudaiii/ops-tools:v1.4 ./update_qa_db.sh' &

もう既に実行してしまった場合

ジョブをバックグラウンドへ

例えばコマンドでフォアグラウンド実行してしまった場合。。。

$ docker run --rm=true --name update-qa-db --env-file=/home/core/.env  quay.io/koudaiii/ops-tools:v1.4 ./update_qa_db.sh

これをバックグラウンド実行するときは、まず、control+zで実行中のJobを停止

  • 実行後、 control+z で停止
$ docker run --rm=true --name update-qa-db --env-file=/home/core/.env  quay.io/koudaiii/ops-tools:v1.4 ./update_qa_db.sh
^Z
[1]+  停止                  docker run --rm=true --name update-qa-db --env-file=/home/core/.env  quay.io/koudaiii/ops-tools:v1.4 ./update_qa_db.sh
  • jobs コマンドで後ほど確認もできる
$ jobs
[1]+  停止                  docker run --rm=true --name update-qa-db --env-file=/home/core/.env  quay.io/koudaiii/ops-tools:v1.4 ./update_qa_db.sh
  • ジョブが複数あった場合はこんな感じになる
$ jobs
[1]   停止                  docker run --rm=true --name update-qa-db --env-file=/home/core/.env  quay.io/koudaiii/ops-tools:v1.4 ./update_qa_db.sh
[2]-  停止                  docker run --rm=true --name update-stage-db --env-file=/home/core/.env  quay.io/koudaiii/ops-tools:v1.4 ./update_qa_db.sh
[3]+  停止                  docker run --rm=true --name update-development-db --env-file=/home/core/.env  quay.io/koudaiii/ops-tools:v1.4 ./update_qa_db.sh
# []の中身がジョブ番号
# + : カレントジョブ
# - : 前のジョブ
  • 停止しているジョブをバックグラウンド実行(ジョブ番号を指定しなければ、カレントジョブとなる)
$ bg ${ジョブ番号}

このまま終わったら通常のバックグラウンド実行と同じで、ログアウトしてしまうとプロセスがkillされてしまうので気をつける!!!

実行中のジョブをログアウト時もバックグラウンド実行する

disown コマンドを利用する

  • job の1番を実行
$ bg 1
  • 実行状態になっていることを確認
$ jobs
[1]   実行中                docker run --rm=true --name update-qa-db --env-file=/home/core/.env  quay.io/koudaiii/ops-tools:v1.4 ./update_qa_db.sh &
[2]-  停止                  docker run --rm=true --name update-stage-db --env-file=/home/core/.env  quay.io/koudaiii/ops-tools:v1.4 ./update_qa_db.sh
[3]+  停止                  docker run --rm=true --name update-development-db --env-file=/home/core/.env  quay.io/koudaiii/ops-tools:v1.4 ./update_qa_db.sh
  • disown %${job番号} で自分のjobテーブルから外れて実行される
$ disown %1
  • jobsから消える
$ jobs
[2]-  停止                  docker run --rm=true --name update-stage-db --env-file=/home/core/.env  quay.io/koudaiii/ops-tools:v1.4 ./update_qa_db.sh
[3]+  停止                  docker run --rm=true --name update-development-db --env-file=/home/core/.env  quay.io/koudaiii/ops-tools:v1.4 ./update_qa_db.sh
  • プロセスを見ると動作している
$ ps x | grep sleep | grep -v grep
22222 pts/3    S      0:00 docker run --rm=true --name update-qa-db --env-file=/home/core/.env  quay.io/koudaiii/ops-tools:v1.4 ./update_qa_db.sh
22223 pts/3    T      0:00 docker run --rm=true --name update-stage-db --env-file=/home/core/.env  quay.io/koudaiii/ops-tools:v1.4 ./update_qa_db.sh
22224 pts/3    T      0:00 docker run --rm=true --name update-development-db --env-file=/home/core/.env  quay.io/koudaiii/ops-tools:v1.4 ./update_qa_db.sh

ジョブが停止中の状態でdisownしてしまうと、ジョブテーブルから除外され、ログアウトしても消えないプロセスが残るので、かならず手動でkillすること

wantedly
「シゴトでココロオドル」ためのビジネスSNS「Wantedly」の開発・運営をしています。
https://wantedlyinc.com/ja/presentations
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away