現在、単純なデーモンプロセスを手動で作成しようとしています。オーバーヘッドを回避するために、既存の外部ライブラリを使用したくありません。
この投稿で説明されているように、現在、プロセスの実行時に、PIDファイルがまだ作成されていない(実行中であることを意味する)ことを確認しています。
また、現在のプロセスからPIDを切り離し、stdoutとstderrをリダイレクトするデーモン化モジュールもあります(セッションを終了してもデーモンは実行され続けます)。
import os
import sys
def daemonize(stdin="/dev/null", stdout="/dev/null", stderr="/dev/null"):
try:
pid = os.fork()
if pid > 0:
sys.exit(0)
except OSError, e:
sys.stderr.write ("fork #1 failed: (%d) %s\n" % (e.errno, e.strerror) )
sys.exit(1)
os.chdir("/")
os.umask(0)
os.setsid()
try:
pid = os.fork()
if pid > 0:
sys.exit(0)
except OSError, e:
sys.stderr.write ("fork #2 failed: (%d) %s\n" % (e.errno, e.strerror) )
sys.exit(1)
stdin_par = os.path.dirname(stdin)
stdout_par = os.path.dirname(stdout)
stderr_par = os.path.dirname(stderr)
if not stdin_par:
os.path.makedirs(stdin_par)
if not stdout_par:
os.path.makedirs(stdout_par)
if not stderr_par:
os.path.makedirs(stderr_par)
si = open(stdin, 'r')
so = open(stdout, 'a+')
se = open(stderr, 'a+', 0)
os.dup2(si.fileno(), sys.stdin.fileno())
os.dup2(so.fileno(), sys.stdout.fileno())
os.dup2(se.fileno(), sys.stderr.fileno())
したがって、現在、以下のサンプル行のようにプロセスを実行でき、デーモンが正しく実行されます。
>$ python myapp.py
しかし、それを停止するには、PIDをgrepして(またはロックファイルから取得して)、次の後に手動でPIDを消去する必要があります。
>$ ps -ef | grep myapp
xxxxx 11901 1 0 19:48 ? 00:00:00 python src/myapp.py
xxxxx 12282 7600 0 19:54 pts/7 00:00:00 grep myapp
>$ kill -9 11901
>$ rm -rf /path/to/lock.pid
次のコマンドでデーモンのライフサイクルを管理できる、よりUnixライクなデーモンが欲しいです。
>$ python myapp.py start
>$ python myapp.py stop
>$ python myapp.py restart
私は確かにargparse
モジュールでそれを行うことができますが、それは少し退屈で醜いようです。
PythonでUnixスタイルのデーモンプロセスを使用するためのシンプルで洗練されたソリューションを知っていますか?