更新帖子:
我有一个在端口上运行的 python Web 应用程序。它用于监视一些其他进程,其功能之一是允许用户重新启动自己的进程。重新启动是通过调用 bash 脚本完成的,该脚本将继续重新启动这些进程并在后台运行它们。
问题是,每当我在使用它重新启动任何用户的进程后杀死 python web 应用程序时,这些进程将以循环方式接管 python web 应用程序使用的端口,所以我无法重新启动由于端口被限制,python web 应用程序。结果,我必须终止重启中涉及的进程,直到没有任何东西占用 python web 应用程序使用的端口。
除了那些占用端口的进程外,一切都很好。这实在是不可取。
可能重新启动的进程:
- redis 服务器
- newrelic-admin 运行程序(生成另一个 Web 应用程序)
- 一个 python 工作进程
更新(2013 年 6 月 6 日):我已经设法解决了这个问题。下面看看我的回答。
原帖:
我有一个在端口上运行的 python Web 应用程序。这个 python 程序有一个调用 bash 脚本的函数。bash 脚本生成一些后台进程,然后退出。
问题是,每当我终止 python 程序时,由 bash 脚本生成的后台进程将接管并占用同一个端口。
具体的子流程是:
- 一个 redis 服务器(在配置文件中使用 daemonize = true)
- newrelic-admin 运行程序(生成一个 Web 应用程序)
- 一个 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 应用程序占用的端口变得更加奇怪......有人知道为什么吗?