※色々実験した内容をgptでまとめているので、不足内容があるかもしれないです
参考
- 早く帰りたいのにリモートでコマンドを実行してしまった時に、バックグラウンド実行に変える方法
- 既に実行中のジョブを走らせたまま端末を閉じる際の手順メモ
- ログアウトしてもバックグラウンド ジョブを継続する方法
1.これからコマンドを実行する
方法1.1:nohup コマンドを使う(Linuxサーバーの場合)
これでセッションが切れても処理は続く。
nohup python your_script.py > output.log 2>&1 &
-
your_script.pyを自分のスクリプトに置き換える - 実行後にターミナルを閉じてもスクリプトは動き続ける
-
output.logに出力されるので、後で確認可能
tail -f path/to/output.log
を行うと、実行時の出力を確認できる。ctrl+cで抜ける。
方法1.2:tmux や screen を使う(ターミナル多重化)
仮想的なターミナルセッションを使って、外出先からも再接続可能。
tmux の基本的な使い方:
tmux # 新しいセッションを開始
python your_script.py # コードを実行
Ctrl + b → d # セッションをデタッチして戻る
- 外出先でも
tmux attachで戻れる
方法1.3:Jupyter Notebook + nohup または tmux
Jupyterで実行している場合も、サーバー側で tmux を併用するのがおすすめ
2.すでに通常のコマンドを実行している場合
方法2.1:tmux や screen を使っていない場合
すでにターミナル上でコードを実行していて、tmux や nohup などを使っていないなら:
● 今すぐできること(Linux/Mac ターミナルの場合):
プロセスをバックグラウンドに移す→ セッション切断後も動作させる
- 実行中のコードに対して
Ctrl + Zを押して一時停止(中断) - 以下のコマンドでバックグラウンドに送る:
bg
- さらに
disownを使ってシェルとの関連を切る:
disown -h %1
これでセッションが切れてもコードは動き続ける。
※
%1はジョブ番号(通常は1、jobsで確認可能)
ps x | grep sleep | grep -v grep
ps aux | grep python
などでプロセスが動き続けているのかを確認できる。
方法2.2:VPNが切れる前にtmuxへ「移植」する(少し難易度高)
一度起動したプロセスを tmux に「移す」ことは原則できないが、方法はある:
-
reptyrというLinuxツールを使って、プロセスを別のセッションに引き継ぐ- 例:
reptyr [PID] - ただし、インストールが必要でサーバーによっては使えない
- 例:
【まとめ】
| 方法 | セッション切断後も実行されるか | 難易度 |
|---|---|---|
nohup + &
|
◎ | 低 |
tmux や screen
|
◎ | 中 |
Ctrl + Z → bg → disown
|
○ | 中 |
reptyr を使って移行 |
◎(ただし環境依存) | 高 |
今実行しているコードを止めずに出かけたい場合は、Ctrl + Z → bg → disown の手順が最速で現実的