更新帖子:
我有一个在端口上运行的pythonweb应用程序。它用于监视其他一些进程,其特性之一是允许用户重新启动自己的进程。重新启动是通过调用bash脚本完成的,该脚本将继续重新启动这些进程并在后台运行它们。在
问题是,每当我在使用python web应用程序来重新启动任何用户的进程后,这些进程都会以循环的方式接管python web应用程序使用的端口,因此由于端口受到限制,我无法重新启动python web应用程序。因此,我必须停止重新启动所涉及的进程,直到pythonweb应用程序使用的端口没有任何东西占用为止。在
除了那些占用端口的进程外,一切正常。这真是不可取的。在
可能重新启动的进程:
更新(2013年6月6日):我设法解决了这个问题。看看下面我的答案。在
原文:
我有一个在端口上运行的pythonweb应用程序。这个python程序有一个调用bash脚本的函数。bash脚本生成一些后台进程,然后退出。在
问题是,每当我终止python程序时,bash脚本产生的后台进程将接管并占用同一端口。在
具体而言,子流程包括:
更新2:我尝试过用nohup运行这些程序。在我杀死pythonweb应用程序之后,只有python工作进程不尝试接管端口。redis服务器和newrelic管理仍然存在。在
我在使用时发现了这个问题subprocess.call在python程序中运行bash脚本。在运行bash脚本之前,我曾在python程序中尝试过一种双fork方法,但是它导致了相同的问题。在
如何防止bash脚本产生的任何进程接管端口?在
谢谢。在
更新:我的意图是,如果python应用程序被关闭,bash脚本产生的那些进程应该继续运行。目前,在我关闭python应用程序之后,它们仍然继续运行。问题是,当我关闭python应用程序时,bash脚本产生的进程开始以循环方式接管端口。在
更新3:根据我看到的“pstree”和“ps-axf”的输出,进程1和2(redis服务器和newrelic管理运行程序生成的web应用程序)不是python web应用程序的子进程。更奇怪的是,当我杀死pythonweb应用程序时,它们会接管它所占用的端口。。。有人知道为什么吗?在
在我继续回答之前,我试着解决上述问题的一些方法的背景知识:
顺便说一句,以上这些都不适合我。每当我关闭执行bash脚本的web应用程序时(这会产生一些我们现在称为Q的后台进程),Q中的进程将以循环方式接管web应用程序所占用的端口,因此在重新启动web应用程序之前,我必须逐个终止它们。在
在经历了很多天的这个问题并继续研究我项目的其他部分之后,我想到了互联网上一些随机的堆栈溢出帖子和其他文章,根据我自己的经验,我回忆起了ssh'ing进入远程并启动了一个分离的屏幕会话,然后注销的体验,一段时间后再次登录,发现屏幕会话仍然存在。在
所以我想,嘿,见鬼,到目前为止还没什么效果,所以我还是试试用屏幕看看能不能解决我的问题。令我大吃一惊和高兴的是!所以我发布这个解决方案希望能帮助那些面临同样问题的人。在
在bash脚本中,我只是使用一个命名的screen进程启动进程。例如,对于redis应用程序,我可以这样启动:
因此,这些进程将继续运行在那些分离的屏幕会话上。在本例中,我没有对redis进程进行守护。在
为了终止屏幕进程,我使用了:
^{pr2}$但是,这并不会杀死redis服务器。所以我不得不分开杀了它。在
现在,在pythonweb应用程序中,我可以使用subprocess.call执行bash脚本,它将生成分离的屏幕会话(使用“screen-dmS”),运行我想要生成的进程。当我关闭pythonweb应用程序时,没有一个派生进程接管它的端口。一切顺利。在
相关问题 更多 >
编程相关推荐