我有一个用python编写的工具,通常应该作为守护进程运行.打包此工具以进行分发的最佳做法是什么,尤其是如何处理设置文件和守护程序可执行文件/脚本?
相关的是,是否有任何常用的工具可以设置守护进程在开机时运行,以适合给定的平台(即linux上的init脚本,windows 上的服务,osx上的launchd)?
我找到的帮助init.d脚本的最佳工具是"start-stop-daemon".它将运行任何应用程序,监视运行/ pid文件,在必要时创建它们,提供停止守护程序的方法,设置进程用户/组ID,甚至可以后台处理您的进程.
例如,这是一个可以启动/停止wsgi服务器的脚本:
#! /bin/bash case "$1" in start) echo "Starting server" # Activate the virtual environment . /home/ali/wer-gcms/g-env/bin/activate # Run start-stop-daemon, the $DAEMON variable contains the path to the # application to run start-stop-daemon --start --pidfile $WSGI_PIDFILE \ --user www-data --group www-data \ --chuid www-data \ --exec "$DAEMON" ;; stop) echo "Stopping WSGI Application" # Start-stop daemon can also stop the application by sending sig 15 # (configurable) to the process id contained in the run/pid file start-stop-daemon --stop --pidfile $WSGI_PIDFILE --verbose ;; *) # Refuse to do other stuff echo "Usage: /etc/init.d/wsgi-application.sh {start|stop}" exit 1 ;; esac exit 0
您还可以看到如何将它与virtualenv一起使用的示例,我总是建议这样做.
为了回答你问题的一部分,我所知道的任何工具都不会在Linux系统中进行便携式设置,更不用说Windows或Mac OS X.
大多数Linux发行版现在似乎都start-stop-daemon
在init脚本中使用,但是你仍然会在文件系统布局和包装方面存在很大差异.如果您的项目都是Python,则使用autotools/configure或distutils/easy_install将大大简化为不同的Linux/BSD发行版构建软件包的过程.
Windows是一个完全不同的游戏,需要Mark Hammond的win32扩展以及Tim Golden的WMI扩展.
我不知道Launchd,除了"以上都不是"是相关的.
有关守护Python脚本的提示,我会查看在现实世界中实际执行此操作的Python应用程序,例如在Twisted内部.
互联网上有许多片段,用于在纯python中编写守护进程(无bash脚本)
http://www.jejik.com/articles/2007/02/a_simple_unix_linux_daemon_in_python/ 看起来很干净......
如果你想自己编写,
原理与bash守护进程函数相同.
基本上:
一开始:
你分叉到另一个进程
打开日志文件以重定向stdout和stderr
保存pid某处.
停止时:
您将SIGTERM发送到pid文件中存储pid的进程.
使用signal.signal(signal.SIGTERM,sigtermhandler),您可以将停止过程绑定到SIGTERM信号.
我不知道任何广泛使用的包这样做.
查看Ben Finney的守护进程模块.他已经开始编写一个针对python 3.X的PEP:
http://www.python.org/dev/peps/pep-3143/
但是这里已经有了一个实现:
http://pypi.python.org/pypi/python-daemon/