我有一个我写过的日志挖掘工具。我可以使用nohup启动它并传入参数,例如它要解析的文件(它使用我在Python中编写的平台无关尾部类)。但是我希望它作为init脚本或从命令行(作为守护进程)启动。如果在同一台服务器上查看多个日志文件,我希望能够启动多个实例。
我查看了python-daemon package,但在参考文档中不清楚是否可以传入进程/实例特定参数。例如比如程序的每个守护进程实例应扫描的日志文件。
我试图解决的一个问题是如何停止或重新启动创建的各个守护程序实例。
答案 0 :(得分:2)
我今天必须做同样的事情,需要作为守护进程运行的多个(相同)应用程序。 我没有使用新的python-daemon包,因为我从来没有使用它,但我很久以前就使用过Sander Marechal(A simple unix/linux daemon in Python)的守护进程。
我创建了一个简单的测试应用程序,而不是最好的python代码,但它按预期工作。该示例使用了一个额外的参数,可以像这样使用:./runsample.py start <param>
您将在每个正在运行的守护程序中看到/ tmp中创建的新日志文件和pid文件。
您可以从此处获取守护程序类:A simple unix/linux daemon in Python
测试应用
import sys, time
from daemon import Daemon
#simple test app that writes to a file every second
#this is just to check that the correct daemons are running
class testapp(Daemon):
ID = 0
def __init__(self, id):
print 'Init (ID): ' + id
#set the params
self.ID = id
#set the pid file
pid = '/tmp/testapp-' + str(id) + '.pid'
#init the base with the pid file location
Daemon.__init__(self, pid)
#this is the overwritten method from the article by Sander Marechal
# http://www.jejik.com/articles/2007/02/a_simple_unix_linux_daemon_in_python/
def run(self):
while True:
#open file, append mode
f = open('/tmp/log-' + self.ID + '.log', 'a')
#write
f.write(str(time.time()))
#close
f.close()
#wait
time.sleep(1)
Init Script / Daemon
#!/usr/bin/env python
#
# Multiple daemons for the same app test
#
import sys
from testapp import testapp
#check is anough arguments are passed
if len(sys.argv) != 3:
print "usage: %s start|stop|restart <param>" % sys.argv[0]
sys.exit(2)
#get the extra arguments
id = sys.argv[2]
print 'Param (ID): ' + sys.argv[2]
#start the app with the parameters
daemon = testapp(id)
#from the article by Sander Marechal
# http://www.jejik.com/articles/2007/02/a_simple_unix_linux_daemon_in_python/
if len(sys.argv) == 3:
if 'start' == sys.argv[1]:
print 'Start'
daemon.start()
elif 'stop' == sys.argv[1]:
daemon.stop()
print 'Stop'
elif 'restart' == sys.argv[1]:
print 'Restarting...'
daemon.restart()
print 'Restarted'
else:
print "Unknown command"
sys.exit(2)
sys.exit(0)
else:
print "usage: %s start|stop|restart" % sys.argv[0]
sys.exit(2)
我希望这也适合你。