文件扩展名何时覆盖 Linux 上的 shebang 行?

dre*_*nch 7 linux shell unix-shell

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

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

#!/usr/local/php5/bin/php
Run Code Online (Sandbox Code Playgroud)

我做了一些实验:

% /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
Run Code Online (Sandbox Code Playgroud)

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

cron 作业再次运行,但我讨厌“不要那样做”的答案。我真的很想知道这种行为是从哪里来的,因为我从未在 shell 级别从 *nix 看到过这样的事情。我在 zsh 和 bash 下都进行了测试,所以我认为我不能责怪 shell 配置。我在 /etc 下搜索“php”,看看是否会给我任何线索,但不会。有任何想法吗?

Rya*_*air 8

听起来你已经用 binfmt_misc 注册了 php。

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

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

作为警告,这可能会破坏系统上的其他内容。例如,如果另一个 PHP 脚本正在执行但没有有效的 shebang。CGI 或 suExec 可能是问题,具体取决于它们的配置。总之,一定要测试一切。