Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/255.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法在cron';d PHP$PATH也不可见_Php_Python_Shell_Cron_Shell Exec - Fatal编程技术网

无法在cron';d PHP$PATH也不可见

无法在cron';d PHP$PATH也不可见,php,python,shell,cron,shell-exec,Php,Python,Shell,Cron,Shell Exec,我正在尝试在我们的环境中实现一个测试集成解决方案。简单的工作流是这样的:我在AWS中有一个CentOS EC2实例,其中有一个MySQL DB,其中的行表示要运行的测试(每个测试都有一个唯一的id、绝对文件路径、开始时间、完成时间等)。这些测试实际上是python脚本(使用unittest框架) 我创建了一个PHP脚本(我选择的语言),它从DB中获取所有未启动的测试,并使用python甚至py.test在本地运行这些测试,我通过代码中的shell\u exec()执行这些测试 不过,在运行PHP

我正在尝试在我们的环境中实现一个测试集成解决方案。简单的工作流是这样的:我在AWS中有一个CentOS EC2实例,其中有一个MySQL DB,其中的行表示要运行的测试(每个测试都有一个唯一的id、绝对文件路径、开始时间、完成时间等)。这些测试实际上是python脚本(使用unittest框架)

我创建了一个PHP脚本(我选择的语言),它从DB中获取所有未启动的测试,并使用python甚至py.test在本地运行这些测试,我通过代码中的
shell\u exec()
执行这些测试

不过,在运行PHP脚本之前,我还执行(至少是第一次)以下bash脚本,以使用带WebDriver的headless Firefox、Selenium Server和Xvfb设置本地测试环境,以实现“显示”:

如果我像这样从终端运行我的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。但我也读过以下内容:一个执行另一个脚本的shell脚本(在我们的例子中是PHP)实际上会为此生成一个子脚本,所以即使在父脚本上设置了$PATH,这个子脚本也能看到$PATH,这并不总是真的吗?我对此不确定

你能帮我吗?在cron中运行上述所有功能的最佳方法是什么?
如何使PHP或shell脚本看到$PATH?(如果至少是这样的话)

从root用户创建一个crontab作业,并从以下位置删除
root
***root/usr/bin/php/path/to/script.php>/path/to/log.log

从root用户创建crontab作业,并从以下位置删除
root
***root/usr/bin/php/path/to/script.php>/path/to/log.log

从root用户创建crontab作业,并从以下位置删除
root
***root/usr/bin/php/path/to/script.php>/path/to/log.log

从root用户创建crontab作业,并从以下位置删除
root
***root/usr/bin/php/path/to/script.php>/path/to/log.log

您可以在cron命令的开头导出
PATH

找到正确的路径

$) echo $PATH
/some/path:/some/other/path
在crontab中,编写

* * * * * export PATH="/some/path:/some/other/path" && /usr/bin/php /path/to/script.php >> /path/to/log.log
或者,您可以在crontab文件的开头设置它,如图所示


由于您设置了显示< /COD>环境变量的值,并开始<代码> XVFB服务器,您应该考虑在shell脚本中设置路径,并将shell脚本作为CRON作业运行(而不是我在示例中使用的PHP脚本)

您可以在cron命令的开头导出
PATH

找到正确的路径

$) echo $PATH
/some/path:/some/other/path
在crontab中,编写

* * * * * export PATH="/some/path:/some/other/path" && /usr/bin/php /path/to/script.php >> /path/to/log.log
或者,您可以在crontab文件的开头设置它,如图所示


由于您设置了显示< /COD>环境变量的值,并开始<代码> XVFB服务器,您应该考虑在shell脚本中设置路径,并将shell脚本作为CRON作业运行(而不是我在示例中使用的PHP脚本)

您可以在cron命令的开头导出
PATH

找到正确的路径

$) echo $PATH
/some/path:/some/other/path
在crontab中,编写

* * * * * export PATH="/some/path:/some/other/path" && /usr/bin/php /path/to/script.php >> /path/to/log.log
或者,您可以在crontab文件的开头设置它,如图所示


由于您设置了显示< /COD>环境变量的值,并开始<代码> XVFB服务器,您应该考虑在shell脚本中设置路径,并将shell脚本作为CRON作业运行(而不是我在示例中使用的PHP脚本)

您可以在cron命令的开头导出
PATH

找到正确的路径

$) echo $PATH
/some/path:/some/other/path
在crontab中,编写

* * * * * export PATH="/some/path:/some/other/path" && /usr/bin/php /path/to/script.php >> /path/to/log.log
或者,您可以在crontab文件的开头设置它,如图所示


由于您设置了“代码>显示值环境变量,并启动<代码> XVFBSver,您应该考虑在shell脚本中设置路径并运行shell脚本作为CRON作业(而不是在我例子中使用的PHP脚本)

谢谢@ ANSH0L,这是有效的!我不确定我到底是否需要shell脚本和设置DISPLAY env变量,因为Xvfb似乎在创建一个带有另一个ID的“新”屏幕。酷!这只是一个建议,以防您想继续使用shell脚本而不是php脚本。谢谢@ansh0l,这很有效!我不确定我到底是否需要shell脚本和设置DISPLAY env变量,因为Xvfb似乎在创建一个带有另一个ID的“新”屏幕。酷!这只是一个建议,以防您想继续使用shell脚本而不是php脚本。谢谢@ansh0l,这很有效!我不确定我到底是否需要shell脚本和设置DISPLAY env变量,因为Xvfb似乎在创建一个带有另一个ID的“新”屏幕。酷!这只是一个建议,以防您想继续使用shell脚本而不是php脚本。谢谢@ansh0l,这很有效!我不确定是否需要shell脚本以及设置显示