python运行生成分离的子进程的shell脚本

2024-06-16 11:12:58 发布

您现在位置:Python中文网/ 问答频道 /正文

更新帖子:

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

问题是,每当我在使用python web应用程序来重新启动任何用户的进程后,这些进程都会以循环的方式接管python web应用程序使用的端口,因此由于端口受到限制,我无法重新启动python web应用程序。因此,我必须停止重新启动所涉及的进程,直到pythonweb应用程序使用的端口没有任何东西占用为止。在

除了那些占用端口的进程外,一切正常。这真是不可取的。在

可能重新启动的进程:

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

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


原文:

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

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

具体而言,子流程包括:

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

更新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应用程序时,它们会接管它所占用的端口。。。有人知道为什么吗?在


Tags: 端口用户程序服务器脚本bashredisweb
0条回答
网友
1楼 · 发布于 2024-06-16 11:12:58

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

  1. 在subprocess.call在
  2. 在子流程.Popen在
  3. 执行者
  4. 双叉方法和上面的方法之一(http://code.activestate.com/recipes/278731-creating-a-daemon-the-python-way/

顺便说一句,以上这些都不适合我。每当我关闭执行bash脚本的web应用程序时(这会产生一些我们现在称为Q的后台进程),Q中的进程将以循环方式接管web应用程序所占用的端口,因此在重新启动web应用程序之前,我必须逐个终止它们。在

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

所以我想,嘿,见鬼,到目前为止还没什么效果,所以我还是试试用屏幕看看能不能解决我的问题。令我大吃一惊和高兴的是!所以我发布这个解决方案希望能帮助那些面临同样问题的人。在

在bash脚本中,我只是使用一个命名的screen进程启动进程。例如,对于redis应用程序,我可以这样启动:

screen -dmS redisScreenName redis-server redis.conf

因此,这些进程将继续运行在那些分离的屏幕会话上。在本例中,我没有对redis进程进行守护。在

为了终止屏幕进程,我使用了:

^{pr2}$

但是,这并不会杀死redis服务器。所以我不得不分开杀了它。在

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

相关问题 更多 >