Engineering Note

プログラミングなどの技術的なメモ

Python サーバプロセスのデーモン化

daemon

プロセスの中でも、バックグラウンドで動作し続けるものをデーモンと言います。

今回は前回作成したデーモンプログラムを利用し、デーモン化したサーバプログラムとそうでないサーバプログラムとの違いを確認してみます。

 

 

デーモンとは

サーバのようなサービスを提供するプロセスは、様々なユーザが利用できとても便利ですが、ある特定のユーザが起動した場合、そのユーザがログアウトするとサーバプロセスも終了してしまいます。

これでは不便なため、どの制御端末にも属さないプロセスとしてデーモン(Daemonというものがあります。

 

デーモンプロセスを作成するために以下の手順を行います。

 

  1. プログラムを起動し、forkをする
  2. 親プロセスを終了する
  3. 子プロセスをセッションリーダにする
  4. 2回目のforkをする
  5. 子プロセスを終了し、孫プロセスをデーモンとする

 

デーモン化していないサーバプログラムの場合

それでは、まずデーモン化を施していないサーバプロセスの動作を確認してみます。

サーバプログラムは前回に作成した簡単なエコーサーバのものを利用します。

 

 

それではターミナルを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
 >

 

サーバプロセスを起動させたユーザがログアウトしても、プロセスは終了していないことが確認できました。

 

参考書籍

Linuxネットワークプログラミングバイブル

ふつうのLinuxプログラミング 第2版 Linuxの仕組みから学べるgccプログラミングの王道