7 votos

¿Cuándo extensiones de archivo override shebang líneas en Linux?

Algunos de PHP cron jobs comenzó a fallar en un servidor compartido recientemente. Ellos habían estado trabajando sin error y no se actualiza desde hace casi un año, pero ahora ya no corren debido a errores de sintaxis. ¿Qué estaba pasando?

Resulta que estas secuencias de comandos de repente ahora se ejecuta en PHP 4, no 5 de PHP. Hay una versión de PHP 4 instalado en /usr/local/bin/php, pero este fue el "proceso" de la línea en estas secuencias de comandos:

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

Hice algunos 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

Yo no sabía Linux sería dejar que las extensiones de archivo anular el proceso de las líneas, pero que es lo que estoy viendo. Apoyo a la empresa de hosting no tenía idea de por qué estaba pasando esto (o lo que había cambiado recientemente a hacer que suceda), así que me fui con una solución: cambiar el nombre de los scripts para que no terminan en ".php".

Los trabajos de cron se ejecuta de nuevo, pero no me gusta un "no lo hagas" como respuesta. Estoy muy curioso de saber que este comportamiento viene, porque nunca he visto nada como esto de *nix en la shell de nivel. He probado tanto bajo zsh y bash, así que no creo que me pueden culpar a un shell de configuración. Yo grepped para 'php' en /etc para ver si me daba alguna pista, pero no. Alguna idea?

10voto

volatilevoid Puntos 2072

No se ve como binfmt_misc, y su empresa de hosting no parecen estar un poco loco :) Pero tengo la sospecha de que probablemente ha hecho esto para la compatibilidad de decisiones .php uso de los archivos de php4 y php5 uso de los archivos de php5. Pruebe con un php5 extensión. No debería ser necesario hacer esto para todos los archivos en un sitio (sólo cronjobs y otras cosas que se ejecute como puestos de trabajo del servidor/scripts) debido a que su servidor web tendrá su propia lógica de ejecución/controladores.

0voto

EvilRyry Puntos 419

Suena como que usted tiene php registrado con binfmt_misc.

Echa un vistazo a la página del manual sobre el tema: binfmt_misc.txt

Usted querrá para anular el registro de php binfmt_misc controlador de eco -1 (debe ser root). Será listada en /proc/sys/fs/binfmt_misc/ si este es su problema.

Como una advertencia, esto podría romper otras cosas en el sistema. Por ejemplo, si otro script de PHP se ejecuta pero no válida en el proceso. CGI o suExec pueden ser problemas en función de su configuración. En resumen, asegúrese de probar todo.

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: