22
Nohup で Linux スクリプトを無人実行する

ロボット、センサープラットフォーム、気象観測所などを構築している場合、ターミナルから切断してもコードの実行が停止しないようにしたいでしょう。そして、nohupはまさにそのような場合に役に立ちます。このハウツーでは、一連の例を通してnohupの使い方を学びます。

ターミナルウィンドウやSSHセッションを閉じた後もコマンドを実行し続けたい場合があります。最も簡単な方法は、nohup(no hangups)を使用することです。nohupを使用すると、ターミナルを閉じた後もコマンドや実行スクリプトを実行できます。

LinuxでのNohupの基本的な使い方

最も基本的な使い方としては、nohup は実行したいスクリプト/コマンドの名前を引数として1つだけ指定します。例えば、test.shというBashスクリプトがあれば、次のように実行できます。

nohup ./test.sh

スクリプト/コマンドが標準出力を生成する場合、その出力はターミナルではなくnohup.outに書き込まれます。出力を確認するには、 tailコマンドを使用してファイルへの更新を追跡します。

tail -f nohup.out

Nohupの使用例

LinuxでNohupを実行する

(画像提供:Tom's Hardware)

毎秒画面にメッセージを表示し、変数nに格納されている値を更新するシンプルなBashスクリプトを作成しました。以下は、test.shというファイルのコードです。

#!/bin/bash
n=0
while true
do echo "I keep counting" echo $n n=$((n+1)) sleep 1
done

1.テキスト エディターを開き、サンプル コードを貼り付けます。

2.ファイルを test.sh としてホームディレクトリに保存します。

Tom's Hardware の最高のニュースと詳細なレビューをあなたの受信箱に直接お届けします。

3.ターミナルを開き、test.sh を実行可能に設定します。

chmod +x test.sh

4.コマンドを実行して、test.sh が実行可能であることをテストします。成功した場合は、Ctrl + C を押して停止します。

5. nohup を使用し、test.sh を引数として指定します。スクリプトの場所をシステムに伝えるために、./test.sh を使用する必要があることに注意してください。ターミナルには「nohup: 入力を無視し、出力を 'nohup.out' に追加します」という出力のみが表示されます。

nohup ./test.sh

6.別のターミナルを開き、tailコマンドを使ってnohup.outファイルへの更新を追跡します。「I keep counting」と表示され、画面に数字がスクロールして表示されます。

tail -f nohup.out

7. nohup を実行しているターミナルを閉じます。閉じるかどうかを確認するメッセージが表示されたら、「はい」を選択します。tail -f を実行しているターミナルは引き続き実行され、nohup がスクリプトを実行中であることが示されます。これは、htop を実行して test.sh を検索することで確認できました。

LinuxでNohupを実行する

(画像提供:Tom's Hardware)

Nohup出力のリダイレクト

LinuxでNohupを実行する

(画像提供:Tom's Hardware)

Nohupには制限があります。デフォルトではnohup.outに書き込まれるため、2つの nohup インスタンスが使用されている場合、両方とも同じファイルに書き込まれます。

LinuxでNohupを実行する

(画像提供:Tom's Hardware)

これを回避するには、リダイレクトを使用して出力を別のファイルに送信します。そこで、nohuppingコマンドを使って Google の DNS サーバーの 1 つに ping を実行し、出力を GooglePing.txt に保存してみましょう。

1.ターミナルウィンドウを開きます。

2. nohupコマンドを使用し、引数としてping 8.8.8.8を指定します。これにより、GoogleのDNSサーバーのいずれかに1秒ごとにpingが送信され、接続テストに役立ちます。

nohup ping 8.8.8.8 > GooglePing.txt

3.別のターミナルを開き、tailコマンドを使ってGooglePing.txtの出力を追跡します。出力の追跡を停止したい場合は、Ctrl+Cを押します。

nohup ping 8.8.8.8 > GooglePing.txt

4. nohup ターミナルで、CTRL+C を押して ping コマンドを停止します。

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

nohupを実行すると、ターミナルの制御権を奪い、事実上ターミナルを無効化します。しかし、Linux のちょっとした魔法を使えば、コマンドをバックグラウンドに実行できます。コマンドをバックグラウンドにすることで、ターミナルを使い続けることができます。

説明のために、ping の例を再利用します。

1.ターミナルウィンドウを開きます。

2. nohupコマンドを使用し、引数としてping 8.8.8.8を指定し、&を追加してコマンドをバックグラウンドに送ります。このコマンドを実行するとプロセスID(PID)が出力されることに注意してください。これは後で必要になります。

nohup ping 8.8.8.8 > GooglePing.txt &

LinuxでNohupを実行する

(画像提供:Tom's Hardware)

3.別のターミナルを開き、tail を使用して GooglePing.txt の出力を追跡します。

4. nohup ターミナルで Enter キーを押してプロンプトに戻ります。nohupコマンドは制御を戻しますが、プロンプトは表示されません。Enter キーを押すと、正しいターミナルプロンプトが表示されます。

5.プロセスIDを指定してkillコマンドを実行し、バックグラウンドプロセスを終了します。プロセスが不要になった場合は、リソースを節約するためにkillするのがベストプラクティスです。この例を実行したままにしておくと、コンピュータの電源がオフになるまでGoogleのDNSサーバーにpingを送信し続けます。

kill 28365

LinuxでNohupを実行する

(画像提供:Tom's Hardware)
  • Linuxファイルシステムを知る
  • Linuxでディスク使用量を確認する方法
  • Linuxでファイルを検索する方法
  • Linuxでユーザーを管理する方法