[英]Single instance of a python daemon (with python-daemon)
我想創建一個永遠運行的程序,一次只能運行一個實例,並且可以使用init.d腳本啟動該程序。 python-daemon似乎是一個不錯的選擇,因為它是PEP 3143的參考實現。
無論如何,我無法理解PID鎖定文件的用途,因為它不會阻止程序運行兩次。
是否應該在init.d腳本(基於'/etc/init.d/skeleton')中手動檢查鎖定文件的存在? 另外我該怎么殺呢? 在PID文件中獲取PID號並發送SIGTERM?
非常感謝。
對我來說,它可以有效地防止通過PID文件啟動第二個實例。 您使用正確嗎? 我的示例基於在PEP 3143參考資料和來源中找到的內容:
#!/usr/bin/env python
import daemon, os, time, lockfile
with daemon.DaemonContext(
pidfile=lockfile.FileLock('./pydaemon.pid'),
working_directory=os.getcwd()):
for i in range(10):
with open('./daemon.log', 'a') as logFile:
logFile.write('%s %s\n' % (os.getpid(), i))
time.sleep(1)
如果我啟動一次,它將創建PID鎖定文件。 如果我第二次啟動它,那么第二個實例將一直休眠直到第一個實例完成為止; 正常的守護程序不會完成,因此這將有效地永久阻止第二個實例。 但是,如果第一個守護程序終止,則啟動第二個守護程序。
我最終使用了Sander Marechal的代碼,該代碼的站點當前已關閉,所以這里是pastebin的鏈接: http : //pastebin.com/FWBUfry5
在下面,您可以找到一個如何使用它的示例,它產生了預期的行為:它不允許您啟動兩個實例。
import sys, time
from daemon import Daemon
class MyDaemon(Daemon):
def run(self):
while True:
time.sleep(1)
if __name__ == "__main__":
daemon = MyDaemon('/tmp/daemon-example.pid')
if len(sys.argv) == 2:
if 'start' == sys.argv[1]:
daemon.start()
elif 'stop' == sys.argv[1]:
daemon.stop()
elif 'restart' == sys.argv[1]:
daemon.restart()
else:
print "Unknown command"
sys.exit(2)
sys.exit(0)
else:
print "usage: %s start|stop|restart" % sys.argv[0]
sys.exit(2)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.