0

Python3、特にデーモン ライブラリを学習しています。デーモンを 2 つの可能な引数 (start と stop) で呼び出す必要があります。

これまでのところ、私はこのコードを持っています:

def start():
  with context:
    pidfile = open(Config.WDIR+scriptname+".pid",'w')
    pidfile.write(str(getpid()))
    pidfile.close()
    feed_the_db()

def stop(pid):
  try:
    kill(int(pid),15)
  except ProcessLookupError:
    print("Nothing to kill… (No process with PID "+pid+")")

if __name__ == "__main__":
  scriptname = sys.argv[0]
  context = daemon.DaemonContext(
  working_directory=Config.WDIR,
  pidfile=lockfile.FileLock(Config.WDIR+scriptname),
  stdout=sys.stdout,
  stderr=sys.stderr)
  try:
    if sys.argv[1] == 'start':
      start()
    elif sys.argv[1] == 'stop':
      try:
        pidfile = open(Config.WDIR+scriptname+".pid",'r')
        pid = pidfile.read()
        pidfile.close()
        remove(name+".pid")
        print(name+" (PID "+pid+")")
        stop(pid)
      except FileNotFoundError:
        print("Nothing to kill… ("+scriptname+".pid not found)")
    else:
      print("\nUnknown option : "+sys.argv[1]+"\n\nUsage "+sys.argv[0]+" <start|stop>\n")   
  except IndexError:
    print("\nUsage "+sys.argv[0]+" <start|stop>\n")

それは機能していますが、正しい方法でやっているのだろうか。

特に、PID を手動で保存する必要があるのはなぜですか。自動作成されたファイルにまだ含まれていないのはなぜですか :

myhostname-a6982700.3392-7990643415029806679

またはロックファイル?

4

1 に答える 1

1

デーモンスクリプトとそれを管理するコードを混同していると思います。

通常、たとえばUbuntuでは、upstartを介してこれを制御します

description "Some Description"
author "your@email-address.com"

start on runlevel [2345]
stop on runlevel [!2345]

exec /path/to/script

実際に実行中の python アプリケーションは、常にアクセスできるため、pid を保存する必要はありません。

では、本質的にデーモン プロセスを管理するスクリプトを書いているのですが、それは本当にあなたが望むものですか?

PS: argparseライブラリについて理解を深めてください。

import argparse
parser = argparse.ArgumentParser(description='Some Description')
parser.add_argument('command', help='Either stop or start', choices=['start', 'stop'])

args = parser.parse_args()
print(args.command)

それはそれだけの価値があります

于 2015-09-12T17:29:56.497 に答える