我正在尝试在我们的环境中实施测试集成解决方案。简单的工作流程是这样的:我在 AWS 中有一个 CentOS EC2 实例,其中有一个 MySQL 数据库,其中的行代表要运行的测试(每个都有唯一的 id、绝对文件路径、开始时间、完成时间等)。这些测试实际上是 python 脚本(使用 unittest 框架)。
shell_exec()
我创建了一个 PHP 脚本(我选择的语言),它从数据库中获取所有未启动的测试,并使用我在代码中执行的 python 甚至 py.test 在本地运行它们。
不过,在运行 PHP 脚本之前,我还执行(至少是第一次)以下 bash 脚本,以使用带有 WebDriver、Selenium Server 和 Xvfb 的无头 Firefox 设置本地测试环境以进行“显示”:
#!/bin/bash
if [ `whoami` != "root" ] ; then
echo "Run as root!"
exit 1
fi
#Start X virtual frame buffer
/etc/init.d/xvfb start
#Add fake display to env
export DISPLAY=:99
#Start Selenium Server
java -jar /opt/selenium-server/selenium-server-standalone-2.33.0.jar &
如果我像这样从终端运行我的 PHP 脚本:# php script.php
一切运行正常,php 调用 shell_exec() 依次运行 python 以使用假显示等通过 py.test 执行测试。
但是,当我尝试在 cron 作业中添加这个 PHP 脚本时,它失败了。我的 cron.d 文件如下所示:
* * * * * root /usr/bin/php /path/to/script.php >> /path/to/log.log
我在网上读到一个解决方案是创建一个 shell 脚本,它将调用其中的 PHP 脚本并将其放入 cron 中。我试过了,它似乎做了一些事情,但它卡在了另一个地方(首先在我的 shell 脚本中export DISPLAY=:99
,以防万一,所以 python 脚本会看到虚拟显示,但我不确定是否需要)。
无论如何,按照上述道路,以某种方式使 py.test 执行,但是当它尝试定位 Firefox 二进制文件(位于 /usr/local/bin/firefox)时会引发异常。似乎 shell 脚本看不到 $PATH。但我也读过以下内容:一个在其中执行另一个脚本(在我们的例子中是 PHP)的 shell 脚本实际上为此产生了一个孩子,所以即使在父脚本上设置了这个孩子也不一定能看到 $PATH ? 我不确定。
你能帮助我吗?在 cron 中运行上述所有内容的最佳方法是什么?如何让 PHP 或 shell 脚本看到 $PATH?(如果这是至少要走的路)