2

更新帖子:

我有一个在端口上运行的 python Web 应用程序。它用于监视一些其他进程,其功能之一是允许用户重新启动自己的进程。重新启动是通过调用 bash 脚本完成的,该脚本将继续重新启动这些进程并在后台运行它们。

问题是,每当我在使用它重新启动任何用户的进程后杀死 python web 应用程序时,这些进程将以循环方式接管 python web 应用程序使用的端口,所以我无法重新启动由于端口被限制,python web 应用程序。结果,我必须终止重启中涉及的进程,直到没有任何东西占用 python web 应用程序使用的端口。

除了那些占用端口的进程外,一切都很好。这实在是不可取。

可能重新启动的进程:

  1. redis 服务器
  2. newrelic-admin 运行程序(生成另一个 Web 应用程序)
  3. 一个 python 工作进程

更新(2013 年 6 月 6 日):我已经设法解决了这个问题。下面看看我的回答。


原帖:

我有一个在端口上运行的 python Web 应用程序。这个 python 程序有一个调用 bash 脚本的函数。bash 脚本生成一些后台进程,然后退出。

问题是,每当我终止 python 程序时,由 bash 脚本生成的后台进程将接管并占用同一个端口。

具体的子流程是:

  1. 一个 redis 服务器(在配置文件中使用 daemonize = true)
  2. newrelic-admin 运行程序(生成一个 Web 应用程序)
  3. 一个 python 工作进程

更新 2:我试过用 nohup 运行这些。在我杀死 python web 应用程序后,只有 python 工作进程不会尝试接管端口。redis 服务器和 newrelic-admin 仍然可以。

当我在 python 程序中使用 subprocess.call 运行 bash 脚本时,我观察到了这个问题。在运行 bash 脚本之前,我在 python 程序中尝试了双叉方法,但它会导致同样的问题。

如何防止从 bash 脚本生成的任何进程接管端口?

谢谢你。

更新:我的意图是,如果 python 应用程序被杀死,那些由 bash 脚本生成的进程应该继续运行。目前,在我关闭 python 应用程序后,它们确实会继续运行。问题是,当我终止 python 应用程序时,由 bash 脚本生成的进程开始以循环方式接管端口。

更新 3:根据我从“pstree”和“ps -axf”看到的输出,进程 1 和 2(redis 服务器和由 newrelic-admin run-program 生成的 Web 应用程序)不是 python Web 应用程序的子进程. 这让他们在我杀死它时接管了 python Web 应用程序占用的端口变得更加奇怪......有人知道为什么吗?

4

1 回答 1

0

在我继续正确回答之前,我只是尝试解决上述问题的方法的一些背景知识:

  1. 子进程调用
  2. 子进程.Popen
  3. 执行
  4. 双叉方法以及上述方法之一(http://code.activestate.com/recipes/278731-creating-a-daemon-the-python-way/

顺便说一句,以上都不适合我。每当我关闭执行 bash 脚本的 Web 应用程序(这反过来又会产生一些我们现在表示为 Q 的后台进程)时,Q 中的进程将以循环方式接管 Web 应用程序占用的端口,所以我必须一一杀死它们,然后才能重新启动我的 Web 应用程序。

在经历了这个问题很多天并转移到我项目的其他部分之后,我想到了互联网上一些随机的 Stack Overflow 帖子和其他文章,并根据我自己的经验,回忆起我 ssh'ing 到远程并启动的经历一个分离的屏幕会话,然后注销,并在一段时间后再次登录以发现屏幕会话仍然存在。

所以我想,嘿,这到底是怎么回事,到目前为止没有任何效果,所以我不妨尝试使用 screen 看看它是否可以解决我的问题。令我惊讶和高兴的是,它确实如此!所以我发布这个解决方案希望能帮助那些面临同样问题的人。

在 bash 脚本中,我只是使用命名的屏幕进程启动了这些进程。例如,对于 redis 应用程序,我可能会这样启动它:

screen -dmS redisScreenName redis-server redis.conf

因此,这些进程将继续在它们开始时使用的那些分离的屏幕会话上运行。在这种情况下,我没有对 redis 进程进行守护进程。

为了杀死屏幕进程,我使用了:

screen -S redisScreenName -X quit

但是,这不会杀死 redis 服务器。所以我不得不单独杀死它。

现在,在 python web 应用程序中,我可以只使用 subprocess.call 来执行 bash 脚本,这将产生分离的屏幕会话(使用'screen -dmS')来运行我想要产生的进程。当我关闭 python web 应用程序时,没有一个生成的进程接管它的端口。一切顺利。

于 2013-06-06T04:58:54.873 回答