Quando as extensões de arquivos substituem as linhas shebang no Linux?

7

Algumas tarefas agendadas do PHP começaram a falhar em um servidor compartilhado recentemente. Eles estavam trabalhando sem erros e sem atualizações há quase um ano, mas agora não seriam mais executados devido a erros de sintaxe. O que estava acontecendo?

Acontece que esses scripts estavam subitamente rodando no PHP 4, não no PHP 5. Há uma versão do PHP 4 instalada em / usr / local / bin / php, mas essa era a linha "shebang" nesses scripts:

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

Eu fiz alguns experimentos:

% /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

Eu não sabia que o Linux permitiria que as extensões de arquivos substituíssem as linhas shebang, mas é isso que estou vendo. O suporte na empresa de hospedagem não tinha ideia de por que isso estava acontecendo (ou o que mudou recentemente para que isso acontecesse), então fui com uma solução: renomeie os scripts para que eles não terminem mais em ".php".

As tarefas agendadas estão sendo executadas novamente, mas eu odeio uma resposta "apenas não faça isso". Estou muito curioso para saber de onde esse comportamento está vindo, porque eu nunca vi nada parecido com isso do * nix no nível do shell. Eu testei em ambos os zsh e bash, então eu não acho que posso culpar uma configuração de shell. Eu procurei por 'php' em / etc para ver se isso me daria alguma pista, mas não. Alguma idéia?

    
por drench 06.11.2009 / 19:14

2 respostas

8

Parece que você tem o php registrado no binfmt_misc.

Confira a man page sobre o assunto: binfmt_misc.txt

Você vai querer cancelar o registro do manipulador php binfmt_misc fazendo eco -1 a ele (deve ser root). Ele será listado em / proc / sys / fs / binfmt_misc / se esse for o seu problema.

Como aviso, isso poderia quebrar outras coisas no sistema. Por exemplo, se outro script PHP estiver sendo executado, mas não tiver um shebang válido. CGI ou suExec podem ser problemas dependendo de sua configuração. Em suma, não deixe de testar tudo.

    
por 06.11.2009 / 19:31
2

Parece binfmt_misc, e sua empresa de hospedagem parece um pouco louca :) Mas eu suspeito que eles provavelmente fizeram isso por compatibilidade, fazendo com que os arquivos .php usem o php4, e os arquivos php5 usem o php5. Tente uma extensão php5. Não deve ser necessário fazer isso para todos os arquivos em um site (apenas cronjobs e outras coisas são executadas como tarefas / scripts do servidor) porque seu servidor da web terá sua própria lógica de execução / manipuladores.

    
por 07.11.2009 / 01:42