在GNU Screen中,Python如果被分离最终会变成空闲状态
我有一个Python脚本,它使用多进程和子进程来同时启动多个外部命令,并且每个命令都有不同的参数。你可以在这里找到代码。
为了方便,我在GNU Screen会话中运行这个脚本。这个脚本运行的机器有12个处理器,直到进程开始工作之前,这些处理器都是闲着的。
每个进程的运行时间从几个小时到几天不等,所以我经常会断开与机器的连接,并且分离这个屏幕会话。
不过,最近我注意到了一种我以前从未遇到过的情况。有几次我回到机器上,发现它处于闲置状态,负载为零。如果我通过ps ux
或top
查看活动进程,我仍然能在进程列表中找到这个脚本(以及它的子进程)。我重新连接到屏幕会话后,立刻就会有一批新的进程被发送到队列中,系统的负载在几秒钟内又回到了12。值得注意的是,我对脚本没有做任何操作,只是重新连接了屏幕会话。
我在系统上安装了一个监控工具,发现一些进程在一段时间后完成,但没有新的进程被启动。因此,系统在子进程忙碌时是活跃的,一旦队列中没有更多的任务被释放,它就会变得闲置。
所以我的问题是,有人知道是什么原因导致这种情况吗?
编辑:大约一年后,这个问题不再出现了,可能是因为对screen或Python本身进行了某些修补。我接受这个答案,因为它提供了很好的测试方向。
1 个回答
4
我不能解释你看到的情况的原因。不过,我有一些建议可以让你尝试。
- 试试把脚本的输出通过管道传递到: | tee out.txt。如果这样没有效果,可以试试……
- 在另一个[hop]主机上运行screen。然后从那里通过SSH连接到你的工作主机。在非模拟的命令行中运行你的脚本。之后你可以随意断开和重新连接到你的hop,查看进程。这应该能让工作主机不知道screen的参与。
请把这些测试的结果告诉我。这样我能更好地帮助你。