由于无法读取自己的pid文件,Paster守护进程将不会closures

TL; DR版本 :当我要求Paster停止守护进程时,它无法读取它用来跟踪进程ID的文件。

更长的版本

我在Windows Vista上运行Python 2.7.1上的Paster(pastescript 1.7.3)。

我的第一个惊喜来自运行一个简单的网站:

>paster serve development.ini Starting server in PID 15184. serving on http://127.0.0.1:5000 

我期望在同一个目录中find一个paster.pid文件,但是我没有。 奇。 没关系,让我们明确地说,杀死这个过程,然后重新开始。

 >paster serve development.ini --pid-file=my.pid Starting server in PID 20884. serving on http://127.0.0.1:5000 

这一次,它创build一个名为my.pid的文件。 在另一个命令窗口中,我可以input:

  >type my.pid 20884 

该网站正在成功的服务和​​任务pipe理器确认有一个Python进程与PID 20884运行。

现在让我们问一下paster报告守护进程的状态:

 >paster serve development.ini --status --pid-file=my.pid PID None in my.pid is not running >type my.pid 20884 

奇。 它声称my.pid中的PID是None ,当它不是。

让我们closures它。

 >paster serve --stop-daemon --pid-file=my.pid PID in my.pid is not valid (deleting) >type my.pid The system cannot find the file specified. 

所以,它试图读取my.pid,无法读取,并在挫折中删除它。

同时守护进程继续运行。

我必须手工杀死贴子守护进程,这是@Lennart Regebro在类似的,不太详细的问题中推荐的 。 我想将其作为我的testing的一部分进行自动化,所以我希望find一个更清洁的解决scheme。

有什么build议么?

从粘贴脚本的源代码( serve.py ),在PID读取方法中:

 pid = read_pidfile(pidfile) if pid: try: os.kill(int(pid), 0) return pid except OSError, e: if e.errno == errno.EPERM: return pid return None 

在POSIX兼容的平台上,指定0作为信号只是检查进程是否还活着 。

但是,在Windows上,不存在kill系统调用; Python 将改为使用TerminateProcess 。 从paster脚本中删除os.kill行,或使用POSIX兼容平台,如Cygwin (Windows之上的POSIX层)或Linux。