Wann überschreiben Dateierweiterungen Shebang-Zeilen unter Linux?


7

Einige PHP-Cron-Jobs sind kürzlich auf einem gemeinsam genutzten Server fehlgeschlagen. Sie hatten fast ein Jahr lang fehlerfrei und ohne Updates gearbeitet, konnten aber aufgrund von Syntaxfehlern nicht mehr ausgeführt werden. Was ist passiert?

Es stellte sich heraus, dass diese Skripte plötzlich unter PHP 4 und nicht unter PHP 5 ausgeführt wurden. Unter / usr / local / bin / php ist eine Version von PHP 4 installiert, aber dies war die "shebang" -Zeile in diesen Skripten:

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

Ich habe einige Experimente gemacht:

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

Ich wusste nicht, dass Linux Dateierweiterungen Shebang-Zeilen überschreiben lassen würde, aber das sehe ich. Der Support des Hosting-Unternehmens hatte keine Ahnung, warum dies geschah (oder was sich kürzlich geändert hatte, um dies zu ermöglichen). Daher ging ich mit einer Problemumgehung vor: Benennen Sie die Skripte um, damit sie nicht mehr mit ".php" enden.

Die Cron-Jobs werden wieder ausgeführt, aber ich hasse die Antwort "Tu das einfach nicht". Ich bin wirklich neugierig zu wissen, woher dieses Verhalten kommt, weil ich so etwas noch nie von * nix auf Shell-Ebene gesehen habe. Ich habe sowohl unter zsh als auch unter bash getestet, daher glaube ich nicht, dass ich eine Shell-Konfiguration beschuldigen kann. Ich suchte nach 'php' unter / etc, um zu sehen, ob mir das irgendwelche Hinweise geben würde, aber nein. Irgendwelche Ideen?


Wow ... neue Hosting-Firmenzeit.
womble

Antworten:


8

Klingt so, als hätten Sie PHP bei binfmt_misc registriert.

Schauen Sie sich die Manpage zum Thema an: binfmt_misc.txt

Sie möchten die Registrierung des PHP-Handlers binfmt_misc aufheben, indem Sie -1 darauf zurückgeben (muss root sein). Es wird in / proc / sys / fs / binfmt_misc / aufgeführt, wenn dies Ihr Problem ist.

Als Warnung könnte dies andere Dinge im System beschädigen. Zum Beispiel, wenn ein anderes PHP-Skript ausgeführt wird, aber keinen gültigen Shebang hat. CGI oder suExec können je nach Konfiguration Probleme verursachen. Kurz gesagt, testen Sie unbedingt alles.


Das scheint es zu sein. Ich habe mir gerade / proc / sys / fs / binfmt_misc / php angesehen und es ist aktiviert und zeigt auf / usr / local / bin / php ... und der Zeitstempel dieser Datei ist genau dann, wenn diese Jobs fehlgeschlagen sind. Dies ist ein gemeinsam genutzter Host, daher habe ich kein Root. Aber zumindest weiß ich, was jetzt passiert ist. Vielen Dank!
durchnässen

Siehe auch : man update-binfmts.
Bis auf weiteres angehalten.

2

Es sieht aus wie binfmt_misc, und Ihr Hosting-Unternehmen scheint ein bisschen verrückt zu sein :) Aber ich vermute, sie haben dies wahrscheinlich aus Kompatibilitätsgründen getan, damit .php-Dateien php4 und php5-Dateien php5 verwenden. Versuchen Sie es mit einer PHP5-Erweiterung. Dies sollte nicht für alle Dateien auf einer Site erforderlich sein (nur Cronjobs und andere Dinge, die als Serverjobs / -skripte ausgeführt werden), da Ihr Webserver über eine eigene Ausführungslogik / Handler verfügt.


Wenn sie es auf einem vorhandenen Server mit Kunden getan haben, unabhängig vom Grund, verdienen sie es, aus einer Kanone geschossen zu werden.
womble
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.