我正在学习Python3,尤其是守护进程库。我想用两个可能的参数来调用我的守护进程:start&停止。
到目前为止,我有这段代码:
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
或锁定文件?
答案 0 :(得分: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)
非常值得