banner
三文字

方寸之间

居善地,心善渊,与善仁,言善信,正善治,事善能,动善时。
github
email
mastodon
website

Linuxのnohupコマンドの解説

前書き#

Linux や Unix システムで長時間実行されるコマンドやスクリプトを実行する際に、ターミナルを閉じるか終了するとプロセスも停止してしまうという問題によく遭遇します。このような場合、プロセスがバックグラウンドで実行され、ターミナルの終了に影響されないようにする方法が必要です。そのために、nohup コマンドが役立ちます。

nohup とは?#

nohupは Linux や Unix システムで使用されるコマンドで、ターミナルを終了してもプロセスをバックグラウンドで継続実行するためのものです。nohupのフルネームは「no hang up」で、「挂起しない」という意味です。nohupコマンドを使用すると、ターミナルを終了したり SSH 接続を閉じたりしてもコマンドを継続して実行することができます。

nohup の構文ルール#

nohupコマンドの基本的な構文は次のとおりです:

nohup COMMAND [ARGS ...] [> output-file 2> error-file] &

各パラメータの意味は次のとおりです:

  • COMMAND:バックグラウンドで実行するコマンドやスクリプト。
  • ARGS:コマンドやスクリプトの引数。
  • > output-file:出力を指定したファイルにリダイレクトする。
  • 2> error-file:エラーメッセージを指定したファイルにリダイレクトする。
  • &:コマンドをバックグラウンドで実行する。

nohupコマンドの実行手順は次のようになります:

  1. nohupコマンドは現在のシェルの標準入力、標準出力、標準エラー出力をすべて/dev/nullデバイスにリダイレクトし、ターミナルの終了シグナルによる中断を回避します。
  2. nohupコマンドはプロセスをバックグラウンドで実行し、プロセスの PID をターミナルに出力します。
  3. プロセスが実行を開始し、標準出力と標準エラー出力を指定したファイルにリダイレクトします。
  4. ユーザーはターミナルを終了したり閉じたりしても、プロセスはバックグラウンドで実行され続けます。

nohup の使用方法#

nohupコマンドの使用は非常に簡単で、上記の基本的な構文に従って入力するだけです。以下にいくつかのnohupコマンドの使用例を示します:

コマンドをバックグラウンドで実行する#

コマンドをバックグラウンドで実行するには、次のコマンドを入力します:

nohup COMMAND &

例えば、Bash スクリプトをバックグラウンドで実行する場合は次のようにします:

nohup bash test.sh &

標準出力をファイルにリダイレクトする#

nohup bash test.sh > stdout.txt &

標準エラー出力をファイルにリダイレクトする#

nohup bash test.sh 2> stderr.txt &

標準出力と標準エラー出力を同じファイルにリダイレクトする#

1. 同じファイルにリダイレクトする場合

nohup bash test.sh > output.txt 2>&1 &

2. 異なるファイルにリダイレクトする場合

nohup bash test.sh > stdout.txt 2> stderr.txt &

3. より複雑な例では、標準入力(stdin)をリダイレクトします:

nohup ./myprogram > foo.out 2> foo.err < /dev/null &

ここで< /dev/nullが追加されており、標準入力を/dev/nullにリダイレクトしてプログラムが標準入力からデータを読み取らないようにします。

これは実際の問題を解決するためのものです。SSH セッションは後ろのジョブとの対話データを失いたくないため、ログアウト(またはサスペンド)を拒否することがよくあります。この問題が発生した場合、上記のコマンドを使用して 3 つのリダイレクトを行うことで解決できます。

nohup でのバックグラウンドプロセスの管理#

jobsコマンドを使用すると、現在のシェルでバックグラウンドで実行されているタスクのリストを表示できます。タスクの番号、状態、コマンドなどが表示されます。

例えば、sleep 1000コマンドをバックグラウンドで実行し、jobsコマンドで確認する場合は次のようにします:

$ jobs
[1]+  Running                 nohup sleep 1000 &

ここで、角括弧内の数字はタスクの番号を示し、プラスまたはマイナス記号はタスクの優先度を示し、Runningはタスクがバックグラウンドで実行されていることを示しています。他にもStopped(停止中)、Done(完了)などの可能な状態があります。

また、fgコマンドを使用してバックグラウンドのタスクを前面に移動して続行することもできます。例えば:

$ fg %1

このコマンドはタスク番号 1 のタスクを前面に移動し、続行します。タスクを一時停止または再開する場合は、Ctrl-Zキーを使用して現在のシェルにSIGTSTPシグナルを送信します。

$ fg %1
nohup sleep 1000

^Z
[1]+  Stopped                 nohup sleep 1000

この状態で再開したい場合は、bgコマンドを使用します:

$ bg %1
[1]+ nohup sleep 1000 &

タスクを終了させたい場合は、killコマンドを使用します:

$ kill %1
[1]+  Terminated              nohup sleep 1000

すべてのバックグラウンドタスクを終了させたい場合は、disownコマンドを使用することもできます:

$ disown -a

このコマンドはすべてのバックグラウンドタスクを終了しますが、確認のメッセージは表示されません。jobsコマンドで確認することで確認できます。

まとめ#

nohupコマンドを使用すると、プログラムをバックグラウンドで実行できます。ターミナルを閉じたりリモートサーバーとの接続を切断したりしても、プログラムの実行に影響を与えません。nohupコマンドで起動したプロセスはすべてのターミナルシグナルを無視するため、Ctrl+Cを使用してもプロセスは停止しません。jobsコマンドを使用してバックグラウンドで実行されているプロセスを表示し、fgコマンドを使用してプロセスを前面で実行することができます。

nohupは、ウェブサーバーやデータベースなど、長時間実行する必要があるスクリプトやプログラムを実行するのに非常に適しています。ただし、nohupコマンドはプロセスが中断される可能性を完全に回避するものではないことに注意してください。システムのクラッシュやプロセスのエラーなど、中断の原因となる状況が発生する可能性があります。

参考文献#

https://en.wikipedia.org/wiki/Nohup


私の個人ブログへようこそ:方寸之间

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。