繁体   English   中英

我该如何解决为什么我的PHP脚本无法从命令行在cron中运行的问题?

[英]How can I troubleshoot why my PHP script won't work in cron when it does from the command line?

我有一个脚本,该脚本从同一个类调用两个函数A和B。 A创建Amazon虚拟服务器,而B通过Amazon命令行工具的shell_exec()销毁一台虚拟服务器。 脚本doActions.php从队列中提取操作。 如果操作是“创建”,则创建一个实例;否则,创建一个实例。 当动作是“破坏”时,它杀死一个。

从命令行php script.php执行脚本时,该脚本可以同时执行A和B。

当我将其放在cron上时,它会运行,但只能成功运行B函数。 它删除销毁实例,但不会创建它们。

故障点显然是函数B。它在第一个也是最重要的shell_exec处阻塞,不返回也不回显任何内容。

echo $string = shell_exec('/home/user/public_html/domain.com/private/ec2-api-tools/bin/ec2-run-instances ami-23b6534a -k gsg-keypair -z us-east-1a');

除非您对Amazon命令行工具的工作方式有所了解,否则请向我建议为什么shell_exec在一种情况下可以工作而在另一种情况下不能工作的原因。

在同一位置的另一个shell_exec的行为符合预期:

echo $string = shell_exec ('echo overflow');

我的猜测是它必须对权限进行处理。 但是,当我有它运行shell_exec('whoami')它返回的“根”,当我su和运行正常工作的命令。 我很难想出创造性的方法来解决为什么我的PHP脚本在命令行中无法在cron中工作的问题。 你能建议一些吗?

当某些内容从命令行运行但在cron拒绝这样做时,通常是环境问题(运行的代码需要使用路径或其他环境变量)。

首先,您应该修改脚本以在最顶部输出当前环境( shell_exec('env') ?),然后检查命令行和cron的输出。

希望会有一些明显的东西,例如AMAZON_EC2_VITAL_VAR但是,如果没有,您应该将cron环境移到命令行一,一次一个变量,直到它开始工作。

快速测试以确定这一点。 在命令行中,执行以下操作:

env >/tmp/pax_env.sh

然后从首先执行的shell脚本运行PHP脚本:

. /tmp/pax_env.sh

因此环境是相同的。

而且请记住, su不能为您提供与以特定用户直接登录所获得的环境相同的功能( su -可以,我认为 )。 您可能需要检查直接以root用户登录时的行为。


发表您的评论:

是的,我相信您已经掌握了。 我可能会将您的答案标记为正确,但需要您为一些聪明的解决方案做一些补充。 首先,执行pax_env.sh脚本的最佳方法是什么? shell_exec()是否起作用?

永远不要说我没有花我的钱:-)否shell_exec几乎肯定会运行一个子Shell,因此变量将该子Shell中设置但不会影响PHP父进程。

我的建议是,如果你想所有这些变量设定,将创建一个shell脚本,包括所有的命令/tmp/pax_env.sh (大概每个前缀与export ),其次是命令,你目前在运行cron ,东西遵循以下原则:

export PATH=.:/usr/bin
export PS1=Urk:
export PS2=MoreUrk:
/home/user/pax/scriptB.php

然后从cron而不是/home/user/pax/scriptB.php直接运行脚本。 这样可以确保在调用PHP代码之前就已经建立了环境。

精明的读者会注意到上面的短语“如果要设置所有这些变量”。 我个人认为将所有命令行变量转储到cron作业的shell脚本中不是一个好主意。 我更希望真正找出需要哪些,并且只包括那些。 这减少了您的cron工作必须承受的污染。 例如,PHP脚本不太可能需要PS1/PS2提示变量。

如果可行,您可以设置所有环境变量-我只是更喜欢绝对最小值,因此事情发生变化时我不必担心太多。

一种找出所需内容的方法是一次注释掉一个export ,直到脚本再次中断。 然后,您知道需要该变量。 一旦使用了注释掉的最大数量的export报表,您就可以完全删除那些注释过的出口报表,剩下的一切,无论多么不可能,都必须可以(对亚瑟·柯南·道尔爵士道歉)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM