【Linux】ターミナルを閉じても処理(プログラム)を停止させない:nohupコマンド
2023.01.10 /
本記事ではLinuxにおける、ターミナルを閉じても処理(プログラム)を停止させない方法について解説していきます。
Linuxにターミナルを通して接続してプログラムを実行している場合、ターミナルを閉じる、またはログアウトすると実行中のプログラムは停止(終了)してしまいます。
ターミナルを終了しても実行中のプログラムを停止させないようにするにはnohupコマンドを使用します。本記事を通して、nohupコマンドについて理解を深めてください。
ターミナルを閉じると処理(プログラム)が停止する問題
発生する問題について
Linuxを利用していると様々な問題に直面することがあります。そのうちの一つにターミナルを閉じると処理(プログラム)が停止する問題があります。
処理に数時間かかるバッチや、常時起動しておきたいプログラムを実行した後、ターミナルを閉じると実行中だったバッチやプログラムは停止してしまいます。
プログラムを「&」を使ってバックグラウンドで実行していても、ターミナルを閉じて少し時間が経つと自動的に終了します。
なぜターミナルを閉じると実行中のプログラムが終了するのか
Linuxにはシグナルによるプロセスを制御する仕組みが備わっています。
シグナルとは、プロセスに特定の動作をするように通知する仕組み。このシグナルによって、外部からプロセスを終了させることができる
プロセスとは、実行中のプログラムのこと。ユーザーがコマンドを実行することでプロセスは生成される
主に使用されるシグナルは以下の通りです。
シグナル名 | シグナル番号 | 説明 |
---|---|---|
SIGHUP | 1 | 端末の切断によるプロセスの終了 |
SIGINT | 2 | 割り込みによるプロセスの終了 |
SIGKILL | 9 | プロセスの終了 |
SIGTERM | 15 | プロセスの終了(デフォルト) |
ターミナルを閉じる際、その端末から起動したプロセスにHUPシグナル(SIGHUP)が送信されます。それにより、プロセスが終了してしまうということです。
プログラムの処理を続ける方法:nohupコマンド
ターミナルが閉じられても処理を停止させない方法として、コマンドをnohupコマンドで実行する方法があります。
nohup コマンド &
nohupコマンドを付けて実行したコマンドはHUPシグナル(SIGHUP)を無視するようになります。つまりターミナルが閉じても、nohupコマンドで実行したプロセスは停止しないということです。
例えばリモート先からではコンソールは使えないので、ターミナルからLinuxサーバーに接続し、時間がかかるバッチ処理を起動させてターミナルを閉じる、といった操作が可能になります。
nohupコマンドの使用例
nohupコマンドの使用例を記します。ここではサーバー側のsocket通信を受信するpythonスクリプトをnohupコマンドで起動します。OSにはUbuntuを使用しています。
Ubuntuでのpythonの起動方法やsocket通信については以下記事をご参照ください。
【Ubuntu】Pythonの実行方法:スクリプトやコマンドによる実行について
【Python】サーバーとクライアント間でのデータ送信・受信方法(socketモジュール)
$ cd /home/ubuntu
$ nohup python3 socket_receive.py &
[1] 545454
nohup: ignoring input and appending output to 'nohup.out'
上記ではnohupコマンドによりプロセスID「545454」が生成されています。次にjobsコマンドでバックグラウンドジョブを表示してみます。
$ jobs
[1]+ Running nohup python3 socket_receive.py &
上記結果より、nohupコマンドで実行したプログラムがバックグラウンドで実行されていることがわかります。
ここまで確認できたら、ターミナルを一度閉じます。そしてターミナルを再度起動し、jobsコマンドでバックグラウンドジョブを確認してみます。
$ jobs
今度はjobsコマンドではなにも表示されなくなりました。次にpsコマンドを実行してシェルから起動したプロセスを表示してみます。
$ ps -ef | grep socket
ubuntu 545454 1 0 16:15 ? 00:00:00 python3 socket_receive.py
今度はちゃんとnohupコマンドで実行したプログラムが実行されていることを確認できました。これよりnohupコマンドで実行したプログラムはターミナルを終了しても停止せずに動き続けていることがわかります。
nohupコマンドで実行したプロセスの終了方法:killコマンド
nohupコマンドで実行したプロセスを終了するにはkillコマンドを実行します。killコマンドは特定のプロセスを終了するためのコマンドです。
kill [オプション] [シグナル名 | シグナル番号] プロセスID
プロセスID「545454」のプロセスを終了させるためには以下コマンドを実行します。
$ kill 545454
killコマンドを実行後、psコマンドでプロセスを確認してみます。
$ ps -ef | grep socket
なにも表示されなかったため、無事プロセスが終了したことがわかります。
まとめ
本記事「【Linux】ターミナルを閉じても処理(プログラム)を停止させない:nohupコマンド」はいかがでしたか。
以下に本記事で紹介した重要な点をまとめます。
- ターミナルを閉じると、その端末で起動したプログラムは停止する
- ターミナルが閉じたときにSIGHUPがプロセスに送信され、プロセスが終了する
- nohupコマンドを使用することによりプロセスはSIGHUPを無視する
- nohupコマンドで実行したプロセスの終了にはkillコマンドを使用する
多くの時間を有するバッチ処理などでぜひnohupコマンドを活用するようにしてください。