※色々実験した内容を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
の手順が最速で現実的