Python - デーモンの作成!
Updated:
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 のインストール
$ pip3.6 install python-daemon
2. Python サンプルスクリプトの作成
- 敢えてオブジェクト指向で作成している。
- Shebang ストリング(1行目)では、フルパスでコマンド指定している。(当方の慣習)
File: 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 スクリプトの実行
まず、実行権限を付与。
$ chmod +x test_daemon.py
そして、実行。
$ ./test_daemon.py
4. 動作確認
プロセスが動作していることを確認する。
$ 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秒毎に日時が記述されていることを確認する。
File: 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. デーモンの停止
以下のコマンドでデーモンを停止する。
$ kill `cat /tmp/test_daemon.pid`
動作確認時に知り得た pid を直接指定してもよい。
$ kill 26370
終了時に “test_dasemon.err” に中断された旨のメッセージが記録される。
File: test_daemon.err
1
Terminating on signal 15
python-daemon のおかげで用意にデーモン化が図れます。(python-daemon を使用しなくても実装はできますが)
以上
Comments