我有一个简单的web.py程序来加载数据。在服务器中,我不想安装apache或任何网络服务器。
我尝试将其作为http://www.jejik.com/articles/2007/02/a_simple_unix_linux_daemon_in_python/
的后台服务并进行子类化: (来自http://www.jejik.com/files/examples/daemon.py)
class Daemon:
def start(self):
"""
Start the daemon
"""
... PID CHECKS....
# Start the daemon
self.daemonize()
self.run()
#My code
class WebService(Daemon):
def run(self):
app.run()
if __name__ == "__main__":
if DEBUG:
app.run()
else:
service = WebService(os.path.join(DIR_ACTUAL,'ElAdministrador.pid'))
if len(sys.argv) == 2:
if 'start' == sys.argv[1]:
service.start()
elif 'stop' == sys.argv[1]:
service.stop()
elif 'restart' == sys.argv[1]:
service.restart()
else:
print "Unknown command"
sys.exit(2)
sys.exit(0)
else:
print "usage: %s start|stop|restart" % sys.argv[0]
sys.exit(2)
但是,web.py软件无法加载(即:服务不听)
如果我直接调用它(即:不使用守护程序代码)工作正常。
答案 0 :(得分:5)
我终于找到了问题。
Web.py从命令行接受可选的端口号:
python code.py 80
该脚本还从命令行获取输入:
python WebServer start
然后web.py尝试使用“start”作为端口号并失败。我没有看到错误,因为在bacground中。
我用迷你黑客解决了这个问题:
if __name__ == "__main__":
if DEBUG:
app.run()
else:
service = WebService(os.path.join(DIR_ACTUAL,'ElAdministrador.pid'))
if len(sys.argv) == 2:
if 'start' == sys.argv[1]:
sys.argv[1] = '8080'
service.start()
答案 1 :(得分:5)
您可以使用此命令启动web.py
/usr/bin/python index.py > log.txt 2>&1 &
答案 2 :(得分:0)
我不认为你告诉守护进程运行。您需要实例化MyDaemon对象并调用o.run()。看起来WebService只启动和停止Web应用程序的服务接口,而不是实际的Web应用程序本身。
答案 3 :(得分:0)
而不是像你在这里写的那样覆盖第二个参数:
if __name__ == "__main__":
if DEBUG:
app.run()
else:
service = WebService(os.path.join(DIR_ACTUAL,'ElAdministrador.pid'))
if len(sys.argv) == 2:
if 'start' == sys.argv[1]:
sys.argv[1] = '8080'
service.start()
你可以删除'start | restart'上的第二个参数,如下所示:
if __name__ == "__main__":
if DEBUG:
app.run()
else:
service = WebService(os.path.join(DIR_ACTUAL,'ElAdministrador.pid'))
if len(sys.argv) == 2:
if 'start' == sys.argv[1]:
delete del sys.argv[1:2]
service.start()
通过这种方式,webpy将接收从命令行传递的所有参数,但守护程序控制器除外。然后你可以简单地运行:
python WebServer start 8080