我的脚本遇到了一些困难。目的是启动一个或多个 OpenVZ 容器来执行一些测试。这些测试可能会很长(通常大约 3 小时)。
第一个脚本是这样的,在对要启动的队列成员进行排序之后,它会:
subprocess.Popen(QUEUE_EXECUTER % queue['queue_id'], shell=True)
其中“QUEUE_EXECUTER % queue['queue_id']”是要运行的完整命令。在 queue_execute 脚本中它是这样的:
# Launching install
cmd = queue['cmd_install']
report_install = open(queue['report_install'], 'a')
process_install = subprocess.Popen(cmd, shell=True, stdout=report_install, stderr=subprocess.STDOUT)
process_install.wait()
# Launching test
logger.debug('Launching test')
report_test = open(queue['report_test'], 'a')
cmd = queue['cmd_test']
process_test = subprocess.Popen(cmd, shell=True, stdout=report_test, stderr=subprocess.STDOUT)
process_test.wait()
它工作得很好,但有一段时间,最近,大部分时间,执行都停止了。日志中没有错误或任何内容。报告文件显示它在一行写入的中间停止(我相信这是因为文件在 python 端没有正确关闭)。在主机方面,OOM 杀手似乎没有做任何事情,我搜索了主机的日志也没有找到任何东西。
上面启动的两个“cmd”是shell脚本,它基本上设置了一个vz,并在上面执行一个测试程序。
所以我的大问题是:我是否遗漏了一些会导致脚本在 python 端停止的东西?
谢谢。
编辑:一些补充信息。
失败的命令总是第二个。这是我尝试执行的命令的两个示例值:/path/vzspawncluster.sh /tmp/file web --tarball /services/pkgs/etch/releases/archive.tar.gz --create
和/path/vzlaunch.sh 172 -b trunk --args "-a -v -s --time --cluster --sql=qa3 --queue=223 --html --mail=adress@mail.com"
vzlaunch 脚本在 OpenVZ 容器上启动 python 脚本,vzctl enter ID /path/script.py
其中 ID 是容器 ID,/path/script.py 是容器上的脚本。
机器 report_install 和 report_test 是位于通过 NFS 共享访问的不同机器上的文件。没关系,但是由于我真的不知道失败时会发生什么,所以无论如何我都会注意到它。
当它失败时,容器上的进程就会死掉。它不会保持任何僵尸状态或任何东西,它只是死了。尽管容器上的进程失败了,但主进程(启动它们的进程)继续进行,好像一切都很好。
更多信息:我尝试了smci 指出的缓冲区刷新方法,但我的日志文件的写入一直在一行中间被剪切:
[18:55:27][Scripteo] Create process '/QA/valideo.trunk/tests/756/test.py -i 10.1.11.122 --report --verbose --name 756 --...
[18:56:35][Scripteo] Create process '/QA/valideo.trunk/tests/762/test.py -i 10.1.11.122 --report --verbose --name 762 --...
[18:57:56][Scripteo] Create process '/QA/valideo.trunk/tests/764/test.py -i 10.1.11.122 --report --verbose --name 764 --...
[18:59:27][Scripteo] Create process '/QA/valideo.trunk/tests/789/test.py -i 10.1.11.122 --report --verbose --name 789 --...
[19:00:44][Scripteo] Create process '/QA/valideo.trunk/tests/866/test.py -i 10.1.11.122 --report --verbose --name 866 --...
[19:02:27][Scripteo] Create process '/QA/valideo.trunk/tests/867/test.py -i 10.1.11.122 --report --verbose --name 867 --...
[19:04:13][Scripteo] Create process '/QA/valideo.trunk/tests/874/t