mk-mode BLOG

このブログは自作の自宅サーバに構築した Debian GNU/Linux で運用しています。
PC・サーバ構築等の話題を中心に公開しております。(クローンサイト: GitHub Pages
※2018年9月15日より非力な環境でサーバを運用しているため、各ページの表示に時間がかかる場合があります。ご了承ください。(改良の予定あり)

ブログ開設日2009-01-05
サーバ連続稼働時間
Reading...
Page View 合計
Reading...
今日
Reading...
昨日
Reading...

Python - デーモンの作成!

[ プログラミング ] [ Python ]

こんばんは。

Python でデーモンスクリプトを作成する方法についての記録です。

0. 前提条件

  • LMDE 2 (Linux Mint Debian Edition 2; 64bit) での作業を想定。
  • Python 3.6.4 での作業を想定。
  • PyPI ライブラリ python-damon を使用。
  • 当方は他のバージョンとの共存環境であり、 python3.6, pip3.6 で 3.6 系を使用するようにしている。(適宜、置き換えて考えること)

1. PyPI ライブラリ python-damon のインストール

1
$ pip3.6 install python-daemon

2. Python サンプルスクリプトの作成

  • 敢えてオブジェクト指向で作成している。
  • Shebang ストリング(1行目)では、フルパスでコマンド指定している。(当方の慣習
test_daemon.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#!/usr/local/bin/python3.6

import datetime
import sys
import traceback
from daemon import DaemonContext
from os     import path
from time   import sleep
from lockfile.pidlockfile import PIDLockFile


class TestDaemon:
    def __init__(self):
        self.basename = path.splitext(path.basename(__file__))[0]
        self.work_dir = path.dirname(path.abspath(__file__))

    def exec(self):
        try:
            dc = DaemonContext(
                working_directory = self.work_dir,
                pidfile = PIDLockFile("/tmp/{}.pid".format(self.basename)),
                stderr = open("{}.err".format(self.basename), "a+")
            )
            with dc:
                self.__do_process()
        except Exception as e:
            raise

    def __do_process(self):
        try:
            while True:
                with open("{}.txt".format(self.basename), "a") as f:
                    f.write(datetime.datetime.now().isoformat() + "\n")
                sleep(10)
        except Exception as e:
            raise

if __name__ == '__main__':
    try:
        obj = TestDaemon()
        obj.exec()
    except Exception as e:
        traceback.print_exc()
        sys.exit(1)

3. Python スクリプトの実行

まず、実行権限を付与。

1
$ chmod +x test_daemon.py

そして、実行。

1
$ ./test_daemon.py

4. 動作確認

プロセスが動作していることを確認する。

1
2
$ ps aux | grep test_daemon
masaru   26370  1.0  0.2  43204  8624 ?        S    22:58   0:00 /usr/local/bin/python3.6 ./test_daemon.py

また、スクリプトと同じディレクトリ内に “test_daemon.txt” が作成され、10秒毎に日時が記述されていることを確認する。

test_daemon.txt
1
2
3
4
5
6
7
8
9
10
11
2018-02-22T22:58:17.636278
2018-02-22T22:58:27.673595
2018-02-22T22:58:37.683451
2018-02-22T22:58:47.693678
2018-02-22T22:58:57.703512
2018-02-22T22:59:07.713767
2018-02-22T22:59:17.718129
2018-02-22T22:59:27.727768
2018-02-22T22:59:37.733244
2018-02-22T22:59:47.734274
2018-02-22T22:59:57.744500

5. デーモンの停止

以下のコマンドでデーモンを停止する。

1
$ kill `cat /tmp/test_daemon.pid`

動作確認時に知り得た pid を直接指定してもよい。

1
$ kill 26370

終了時に “test_dasemon.err” に中断された旨のメッセージが記録される。

test_daemon.err
1
Terminating on signal 15

python-daemon のおかげで用意にデーモン化が図れます。(python-daemon を使用しなくても実装はできますが)

以上

Comments