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

## まだ実行前の場合

### `nohup` でバックグランド実行

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

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

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

```bash
$ 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' &
```

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

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

- ref：http://kazmax.zpp.jp/linux_beginner/jobs_fg_bg.html

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

```bash
$ 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` で停止

```bash
$ 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` コマンドで後ほど確認もできる

```bash
$ 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
```

- ジョブが複数あった場合はこんな感じになる

```bash
$ 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
# []の中身がジョブ番号
# + : カレントジョブ
# - : 前のジョブ
```

- 停止しているジョブをバックグラウンド実行(ジョブ番号を指定しなければ、カレントジョブとなる)

```bash
$ bg ${ジョブ番号}
```

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

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

### `disown` コマンドを利用する

- `job` の1番を実行

```bash
$ bg 1
```

- 実行状態になっていることを確認

```bash
$ 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テーブルから外れて実行される

```bash
$ disown %1
```

- jobsから消える

```bash
$ 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
```

- プロセスを見ると動作している

```bash
$ 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すること**