プロセスの中でも、バックグラウンドで動作し続けるものをデーモンと言います。
今回は前回作成したデーモンプログラムを利用し、デーモン化したサーバプログラムとそうでないサーバプログラムとの違いを確認してみます。
デーモンとは
サーバのようなサービスを提供するプロセスは、様々なユーザが利用できとても便利ですが、ある特定のユーザが起動した場合、そのユーザがログアウトするとサーバプロセスも終了してしまいます。
これでは不便なため、どの制御端末にも属さないプロセスとしてデーモン(Daemon)というものがあります。
デーモンプロセスを作成するために以下の手順を行います。
- プログラムを起動し、forkをする
- 親プロセスを終了する
- 子プロセスをセッションリーダにする
- 2回目のforkをする
- 子プロセスを終了し、孫プロセスをデーモンとする
デーモン化していないサーバプログラムの場合
それでは、まずデーモン化を施していないサーバプロセスの動作を確認してみます。
サーバプログラムは前回に作成した簡単なエコーサーバのものを利用します。
それではターミナルを2つ用意し、動作を確認してみます。
#term1でサーバプロセス起動 > python3 server.py 8000 & [1] 2153 port=8000 ready for accept > # term2でサーバプロセスの確認 > ps -jA | grep python 2153 2153 2137 pts/0 00:00:00 python3 # term1でログアウト > exit Connection to 127.0.0.1 closed. # term2で再度プロセス確認 > ps -jA | grep python 2153 2153 2137 ? 00:00:00 python3 > nc localhost 8000 > ps -jA | grep python >
サーバプロセスを起動させたユーザがログアウトしたところで、サーバプロセスも終了してしまいます。
デーモン化したサーバプログラムの場合
それでは、デーモン化を施したサーバプロセスの動作を確認してみます。
デーモンプログラムは前回に作成したものをインポートし、server_socket()
の前に挿入し、デーモン化させます。
#term1でサーバプロセス起動 python3 server.py 8000 & [1] 2276 > # term2でサーバプロセスの確認 > ps -jA | grep python 2278 2277 2277 ? 00:00:00 python3 > # term1でログアウト > exit logout [1]+ Done python3 server.py 8000 Connection to 127.0.0.1 closed. # term2で再度プロセス確認 > ps -jA | grep python 2278 2277 2277 ? 00:00:00 python3 > nc localhost 8000 test test:OK ^C > ps -jA | grep python 2278 2277 2277 ? 00:00:00 python3 >
サーバプロセスを起動させたユーザがログアウトしても、プロセスは終了していないことが確認できました。