[Linux] nohupコマンドの使い方 – バックグラウンドでプロセス実行

nohupコマンドは、シェルが終了してもプロセスを継続して実行するために使用されます。

通常、シェルを閉じるとそのシェルで実行中のプロセスも終了しますが、nohupを使うことでこれを防ぎます。

使い方は「nohup コマンド &」の形式で、”&”を付けることでバックグラウンド実行が可能です。

出力はデフォルトで nohup.out というファイルにリダイレクトされますが、明示的にファイルを指定することもできます。

この記事でわかること
  • nohupコマンドの基本的な使い方
  • バックグラウンド実行の方法
  • 複数コマンドの実行方法
  • cronとの組み合わせ方
  • 権限エラーの対処法

目次から探す

nohupコマンドとは

nohup(ノーハングアップ)コマンドは、LinuxやUnix系のオペレーティングシステムで使用されるコマンドの一つで、ユーザーがログアウトしてもプロセスを継続して実行するためのものです。

通常、ターミナルを閉じると、そのターミナルで実行中のプロセスは終了しますが、nohupを使うことで、プロセスをバックグラウンドで実行し続けることができます。

これにより、長時間実行されるスクリプトやプログラムを、ユーザーがログインしていない状態でも動作させることが可能になります。

nohupは、特にサーバー管理や自動化スクリプトの実行時に非常に便利です。

標準出力や標準エラー出力は、デフォルトでnohup.outというファイルにリダイレクトされるため、実行結果を後から確認することもできます。

nohupコマンドの基本的な使い方

nohupの基本構文

nohupコマンドの基本的な構文は以下の通りです。

nohup command [arguments] &

ここで、commandは実行したいコマンド、[arguments]はそのコマンドに渡す引数です。

最後の&は、コマンドをバックグラウンドで実行するために必要です。

標準出力と標準エラー出力のリダイレクト

nohupコマンドを使用すると、標準出力(stdout)と標準エラー出力(stderr)は自動的にnohup.outファイルにリダイレクトされます。

これにより、コマンドの実行結果やエラーメッセージを後から確認することができます。

リダイレクトを明示的に指定することも可能です。

nohup.outファイルの役割

nohup.outファイルは、nohupコマンドで実行したプロセスの標準出力と標準エラー出力を保存するためのファイルです。

このファイルは、コマンドが実行されるディレクトリに自動的に作成されます。

特に、長時間実行されるプロセスの出力を確認する際に役立ちます。

ファイルが存在しない場合は、新たに作成されます。

出力ファイルを指定する方法

nohupコマンドを使用する際に、出力ファイルを指定することもできます。

以下のようにリダイレクトを使って、任意のファイルに出力を保存できます。

nohup command [arguments] > output_file 2>&1 &

ここで、output_fileは出力を保存したいファイル名です。

2>&1は、標準エラー出力を標準出力にリダイレクトするための指定です。

これにより、両方の出力を一つのファイルにまとめることができます。

nohupコマンドとバックグラウンド実行

& を使ったバックグラウンド実行

nohupコマンドを使用する際、コマンドの最後に&を付けることで、そのプロセスをバックグラウンドで実行することができます。

これにより、ターミナルを閉じてもプロセスが継続して動作し続けます。

例えば、以下のように実行します。

nohup my_script.sh &

このコマンドを実行すると、my_script.shがバックグラウンドで実行され、ターミナルはすぐに次のコマンドを受け付ける状態になります。

fgとbgコマンドでのプロセス制御

バックグラウンドで実行中のプロセスを制御するために、fg(フォアグラウンド)とbg(バックグラウンド)コマンドを使用します。

  • fgコマンドは、指定したジョブをフォアグラウンドに戻します。
  • bgコマンドは、指定したジョブをバックグラウンドで再開します。

これらのコマンドを使用することで、実行中のプロセスを柔軟に管理できます。

jobsコマンドでのプロセス確認

jobsコマンドを使用すると、現在のシェルセッションで実行中のジョブの一覧を確認できます。

ジョブの状態(実行中、停止中など)やジョブ番号が表示されます。

以下のように実行します。

jobs

このコマンドを実行すると、バックグラウンドで動作しているプロセスや停止中のプロセスの情報が表示されます。

プロセスID (PID) の確認方法

実行中のプロセスのプロセスID(PID)を確認するには、psコマンドを使用します。

以下のように実行します。

ps aux | grep my_script.sh

このコマンドは、my_script.shという名前のプロセスを検索し、そのPIDを含む情報を表示します。

PIDを知ることで、特定のプロセスを管理したり、終了させたりすることができます。

nohupを使った実行例

長時間実行するスクリプトの実行

長時間実行されるスクリプトをnohupを使って実行することで、ターミナルを閉じても処理を続けることができます。

例えば、データ処理を行うスクリプトdata_processing.shを実行する場合、以下のようにします。

nohup bash data_processing.sh > output.log 2>&1 &

このコマンドでは、標準出力と標準エラー出力をoutput.logにリダイレクトしています。

スクリプトが実行されている間、ターミナルは他のコマンドを受け付けることができます。

サーバー上でのデーモンプロセスの実行

サーバー上でデーモンプロセスを実行する際にもnohupは非常に便利です。

例えば、Webサーバーを起動する場合、以下のように実行します。

nohup python3 my_web_server.py > server.log 2>&1 &

このコマンドにより、my_web_server.pyがバックグラウンドで実行され、サーバーがリクエストを受け付け続けます。

出力はserver.logに記録されます。

これにより、サーバーが動作している間も他の作業を行うことができます。

リモート接続時のプロセス維持

SSHでリモートサーバーに接続している場合、接続が切断されてもプロセスを維持したいことがあります。

nohupを使うことで、リモート接続中に実行したプロセスを維持できます。

例えば、長時間のバックアップスクリプトを実行する場合、以下のようにします。

nohup bash backup_script.sh > backup.log 2>&1 &

このコマンドを実行すると、backup_script.shがバックグラウンドで実行され、接続が切断されても処理が続行されます。

出力はbackup.logに保存され、後から確認することができます。

nohupコマンドの応用

複数のコマンドをnohupで実行する方法

複数のコマンドをnohupで実行する場合、セミコロン;や論理演算子&&を使用して、1つのnohupコマンドでまとめて実行できます。

例えば、以下のように記述します。

nohup command1; nohup command2 &

または、次のように論理演算子を使うこともできます。

nohup command1 && nohup command2 &

この方法により、複数のコマンドをバックグラウンドで同時に実行し、各コマンドの出力をそれぞれのファイルにリダイレクトすることが可能です。

cronとnohupを組み合わせた自動実行

cronは定期的にコマンドを実行するためのツールですが、nohupと組み合わせることで、長時間実行されるタスクを自動的に実行することができます。

crontabに以下のように記述します。

* * * * * nohup /path/to/script.sh > /path/to/output.log 2>&1 &

この設定により、指定したスクリプトが毎分実行され、出力はoutput.logに保存されます。

nohupを使うことで、スクリプトが長時間実行されても、cronが正常に動作し続けます。

nohupとシェルスクリプトの組み合わせ

nohupはシェルスクリプトと組み合わせて使用することが多いです。

シェルスクリプト内で複数のコマンドを実行し、そのスクリプトをnohupで実行することで、全体の処理をバックグラウンドで行うことができます。

例えば、以下のようなシェルスクリプトmy_script.shがあるとします。

#!/bin/bash
echo "処理を開始します"
sleep 60
echo "処理が完了しました"

このスクリプトをnohupで実行するには、次のようにします。

nohup bash my_script.sh > script_output.log 2>&1 &

これにより、スクリプトの実行がバックグラウンドで行われ、出力はscript_output.logに保存されます。

nohupとscreen/tmuxの違いと使い分け

nohupscreentmuxは、いずれもプロセスをバックグラウンドで実行するためのツールですが、それぞれの特性があります。

スクロールできます
特徴nohupscreen/tmux
プロセス管理簡単なバックグラウンド実行複数のセッション管理が可能
接続維持ターミナルが閉じても実行継続セッションを再接続可能
使用方法単一コマンドの実行複数コマンドの同時実行
  • nohupは、単一のコマンドを簡単にバックグラウンドで実行したい場合に適しています。
  • screentmuxは、複数のコマンドを同時に実行したり、セッションを再接続したりする必要がある場合に便利です。

このように、用途に応じて使い分けることが重要です。

nohupコマンドの注意点

nohup.outファイルの肥大化に注意

nohupコマンドを使用すると、標準出力と標準エラー出力がnohup.outファイルにリダイレクトされます。

長時間実行されるプロセスや頻繁に出力を行うコマンドを実行すると、このファイルが肥大化する可能性があります。

ファイルサイズが大きくなると、ディスクスペースを圧迫し、最終的にはシステムのパフォーマンスに影響を与えることがあります。

定期的にファイルを確認し、必要に応じて削除またはアーカイブすることが重要です。

権限エラーの対処法

nohupコマンドを実行する際に、権限エラーが発生することがあります。

特に、実行しようとしているコマンドやスクリプトに対して適切な実行権限がない場合、エラーが発生します。

この場合、以下の対策を講じることができます。

  • スクリプトやコマンドに実行権限を付与する:
chmod +x script.sh
  • 実行するユーザーが必要な権限を持っているか確認する。

権限エラーが発生した場合は、エラーメッセージを確認し、適切な対処を行うことが重要です。

プロセスが停止する場合の原因と対策

nohupで実行したプロセスが停止する場合、いくつかの原因が考えられます。

主な原因とその対策は以下の通りです。

  • メモリ不足:プロセスが必要とするメモリを超えると、システムがプロセスを強制終了することがあります。

対策として、メモリ使用量を監視し、必要に応じてシステムのリソースを増やすことが考えられます。

  • 依存関係の問題:実行中のプロセスが他のプロセスやリソースに依存している場合、それらが停止すると影響を受けることがあります。

依存関係を確認し、必要なリソースが常に利用可能であることを確認します。

  • エラーによる停止:スクリプト内でエラーが発生すると、プロセスが停止することがあります。

エラーログを確認し、問題を特定して修正することが重要です。

これらの原因を把握し、適切な対策を講じることで、nohupで実行したプロセスの安定性を向上させることができます。

よくある質問

nohup.outファイルを作成しない方法は?

nohupコマンドを使用する際に、nohup.outファイルを作成しない方法は、出力を/dev/nullにリダイレクトすることです。

以下のように実行します。

nohup command > /dev/null 2>&1 &

このコマンドでは、標準出力と標準エラー出力の両方を/dev/nullにリダイレクトしているため、出力ファイルは作成されません。

これにより、出力を記録せずにプロセスを実行することができます。

nohupで実行したプロセスを停止するには?

nohupで実行したプロセスを停止するには、まずそのプロセスのプロセスID(PID)を確認する必要があります。

psコマンドを使用してPIDを確認し、次にkillコマンドを使ってプロセスを終了させます。

以下の手順で実行します。

  1. プロセスIDを確認する:
ps aux | grep command_name
  1. プロセスを停止する:
kill PID

ここで、PIDは停止したいプロセスのIDです。

強制終了が必要な場合は、kill -9 PIDを使用しますが、通常はまずkillコマンドを試みることが推奨されます。

nohupと disown の違いは?

nohupdisownは、いずれもプロセスをバックグラウンドで実行するための手段ですが、異なる目的と機能を持っています。

  • nohup:プロセスをバックグラウンドで実行し、ターミナルが閉じてもプロセスが継続するようにします。

出力はデフォルトでnohup.outにリダイレクトされます。

  • disown:既に実行中のジョブをバックグラウンドに移動し、シェルからそのジョブを切り離します。

これにより、ターミナルを閉じてもそのジョブが終了しないようにしますが、nohupのように出力をリダイレクトする機能はありません。

このように、nohupは新たにプロセスを開始する際に使用し、disownは既存のプロセスを管理するために使用します。

用途に応じて使い分けることが重要です。

まとめ

この記事では、nohupコマンドの基本的な使い方から応用例、注意点まで幅広く解説しました。

特に、バックグラウンドでプロセスを実行する際の利便性や、複数のコマンドを同時に扱う方法についても触れました。

これを機に、nohupを活用して、長時間実行されるタスクやサーバー管理をより効率的に行ってみてはいかがでしょうか。

  • URLをコピーしました!
目次から探す