什么时候文件扩展名会覆盖Linux上的shebang行?

一些PHP cron作业最近在共享服务器上开始失败。 他们一直在工作没有错误,近一年没有更新,但现在由于语法错误将不再运行。 发生了什么事?

事实certificate,这些脚本现在突然在PHP 4下运行,而不是PHP 5.在/ usr / local / bin / php上安装了PHP 4的一个版本,但这是这些脚本上的“shebang”行:

#!/usr/local/php5/bin/php 

我做了一些实验:

 % /usr/local/php5/bin/php --version PHP 5.2.6 (cli) (built: May 11 2008 13:09:39) Copyright (c) 1997-2008 The PHP Group Zend Engine v2.2.0, Copyright (c) 1998-2008 Zend Technologies with Zend Extension Manager v1.2.2, Copyright (c) 2003-2007, by Zend Technologies with Zend Optimizer v3.3.3, Copyright (c) 1998-2007, by Zend Technologies % echo '<?= phpversion() ?>' | /usr/local/php5/bin/php 5.2.6 % printf '#!/usr/local/php5/bin/php\n<?= phpversion() ?>' > version % chmod +x version % ./version 5.2.6 % mv version x.php % ./x.php 4.4.9 

我不知道Linux会让文件扩展名覆盖shebang行,但这就是我所看到的。 在托pipe公司的支持不知道为什么发生这种情况(或最近发生了什么变化),所以我采取了一种解决方法:重命名脚本,使它们不再以“.php”结尾。

cron的工作再次运行,但我讨厌一个“只是不这样做”的答案。 我真的很好奇,知道这个行为是从哪里来的,因为我从来没有在shell级别的* nix中看到过类似的东西。 我在zsh和bash下testing,所以我不认为我可以指责一个shellconfiguration。 我在/ etc下grepped'php',看看能否给我任何线索,但不会。 有任何想法吗?

听起来像你有PHP注册binfmt_misc。

查看主题的手册页: binfmt_misc.txt

你需要通过回显-1取消注册php binfmt_misc处理程序(必须是root)。 它将被列在/ proc / sys / fs / binfmt_misc /如果这是你的问题。

作为一个警告,这可能会打破系统上的其他东西。 例如,如果另一个PHP脚本正在执行,但没有有效的shebang。 CGI或suExec可能是问题取决于他们的configuration。 总之,一定要testing一切。

它看起来像binfmt_misc,而你的托pipe公司似乎有点疯狂:)但我怀疑他们可能已经做到这一点的兼容性,使.php文件使用php4和php5文件使用php5。 尝试一个php5扩展。 对于一个站点上的所有文件(只是cronjobs和其他的东西以服务器作业/脚本的forms运行),没有必要这样做,因为你的web服务器将有自己的执行逻辑/处理程序。