2015-09-12 97 views
0

我在學習Python3,尤其是守護進程庫。我想用兩個可能的參數調用我的守護進程:start & stop。Python3守護進程庫

到目前爲止,我有這樣的代碼:

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 

或鎖定文件?

回答

1

我認爲你在混合守護進程腳本和負責管理它的代碼。

通常在說Ubuntu的,例如,你將通過新貴

description "Some Description" 
author "[email protected]" 

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) 

這是非常值得的

+0

感謝你的答案Anarci。是的,這真的是我想要的。之所以我不想在Upstart上轉播,或者我們說systemd,是因爲我希望腳本能夠成爲平臺不可知論者......我只是在原型階段,當然我會嘗試將守護進程管理從在我最終的程序中的實際處理...我會看看argparse庫。 我對我在這裏得到的快速反應感到驚訝(這是我的第一篇文章),確實是這樣! 祝您有愉快的一天。 –

+0

我明白了,在這種情況下,您肯定需要某種方法將進程中的pid傳遞給管理腳本。我將定義一個目錄,其中所有正在運行的腳本都會寫入一個以其pid命名的文件,然後在關閉時刪除該文件。這與守護進程無關。 –