初めに #
Linuxでコマンドやスクリプトを実行しているときに、「ターミナルを閉じたら処理が止まってしまった…」という経験をしたことがある方は多いのではないでしょうか。
特にSSHで接続にて作業を行っている場合、うっかりウィンドウを閉じてしまったり、ネットワーク接続の問題で切断されたりすると、せっかく実行していた処理が途中で止まってしまうことがあります。
本記事では、nohup & disown を組み合わせることで、ログアウトしても止まらないバックグラウンド処理の構築方法をわかりやすく解説します。
なぜログアウトすると処理が止まるのか #
Linuxでは、ターミナルやSSH経由で起動したプロセスは、親プロセスであるログインシェルに紐づけられて実行されます。
そのため、ログアウトやセッションの切断によってログインシェルが終了すると、そのシェルから起動された子プロセスも一緒に終了してしまう仕組みになっています。
ログアウト後も処理を継続させる方法 #
ここでは、nohup と & と disown を活用して、ログアウト後も処理を安全にバックグラウンドで実行し続ける方法を、3ステップで解説します。
1.nohupと&を利用しコマンドを実行 #
初めに実行中のコマンドがログアウトやセッション切断でも終了しないようにするために、nohup を使って実行します。
加えて & を使い処理をバックグラウンド化します。
以下は基本的な実行方法となります。
nohup コマンド > 任意のログパス 2>&1 &
以下はPythonスクリプトによるデータ処理を実行した例となります。
nohup python3 process_data.py > process.log 2>&1 &
2.disownを利用しログインシェルと分離 #
nohup と & を利用し実行した場合、基本的にはログアウト後もスクリプトは実行され続けます。
ただしこの時点では、プロセスはまだログインシェルのジョブとして紐づいている状態となります。
そのため、この状態のままログアウトすると、「stopped jobs」などの警告が表示されたり、シェルによってはプロセスが終了するリスクが残ります。
以下の様にdisownコマンドを実行する事でジョブを現在のシェルから切り離す事ができます。
disown
複数のジョブが実行されている場合は以下の様にジョブ番号を指定する事が可能です。
disown %ジョブ番号
3.確認 #
最後にバックグラウンドで実行している処理が正常に動いているかを確認する方法をいくつか紹介します。
プロセスを確認する #
実行中のプロセスを確認するには、psコマンドを使用します。
特定のユーザーやコマンドで絞り込むことで、不要な情報を排除し絞り込む事ができます。
自分のプロセスだけを表示する場合は以下の様に実行します。
ps -u $(whoami)
コマンドやスクリプト名で絞り込む場合は以下の様に実行します。
ps aux | grep コマンド
ログファイルを監視する #
処理の進捗やエラーメッセージをリアルタイムで確認したい場合は、tailコマンドが便利です。
以下の様に「-f」オプションを付与しログファイルを指定する事でリアルタイムに内容を監視する事ができます。
tail -f 指定したログパス
注意事項 #
バックグラウンドで長時間動作するプロセスは、CPUやメモリ、ディスクI/Oなどのリソースを圧迫する可能性があります。
そのため、定期的に top や htop、iotop などでリソースの使用状況を監視し、システム全体に影響を与えていないか確認する事を推奨いたします。
また、共用サーバーやVPSサーバー環境では、過剰な負荷をかけるプロセスが検出されると、自動的にプロセスの強制終了が行われたり、リソース制限が適用される場合があります。