LoginSignup
29
26

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-05-02

まだ実行前の場合

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すること

29
26
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
29
26