python3系でプロセスの2重起動とかの多重起動を防ぐ方法です。
多重起動を防ぐ一般的な方法としては大体以下の2つかと。
- ロックファイルを作る
- プロセスの状況をOSなどから監視する
ロックファイルは、プロセスkillしたりすると起動しなくなったりであまり好きじゃないです。
プロセス監視はシェルからの例が多くて、pythonそのものやっている例があまりなかったので以下に記載しておきます。
sample.py
# -*- coding: utf-8 -*-
from os import path
import subprocess
# 2重起動を防ぐ
file_name = path.basename(__file__)
p1 = subprocess.Popen(["ps", "-ef"], stdout=subprocess.PIPE)
p2 = subprocess.Popen(["grep", file_name], stdin=p1.stdout, stdout=subprocess.PIPE)
p3 = subprocess.Popen(["grep", "python"], stdin=p2.stdout, stdout=subprocess.PIPE)
p4 = subprocess.Popen(["wc", "-l"], stdin=p3.stdout, stdout=subprocess.PIPE)
p1.stdout.close()
p2.stdout.close()
p3.stdout.close()
output = p4.communicate()[0].decode("utf8").replace('\n','')
if int(output) != 1:
exit()
自身のファイル名を調べて、同じ名前のプロセスが1個でなかったら、処理をそのまま停止しています。
1個なのは起動したスクリプトです。
間にpythonという名前でgrepしているのは、viewとか他のプロセスの起動で邪魔されないことと、grepのプロセスそのものを排除しています。
プログラムの頭にあるともっさりしていますが、重い処理の時はそれなりに便利です。