2015-11-01 2 views
8

Nach PHP-Upgrade begann ich die folgenden Cron Fehler mehrmals am Tag zu bekommen:Cron sessionclean Fehler: finden: `/ proc/xxxxx/fd ': Keine solche Datei oder das Verzeichnis

find: `/proc/xxxxx/fd': No such file or directory 

Aus PHP kommt sessionclean cron job:

[ -x /usr/lib/php5/sessionclean ] && /usr/lib/php5/sessionclean 

Irgendwelche Ideen?

+0

Haben Sie versucht, die Maschine neu zu starten, die das hostet? ;) Können Sie auch den Pfad der 'session.save_path' Konfiguration bestätigen? –

+0

sessionclean versucht, Sitzungen für nicht vorhandene PHP-Prozesse zu aktualisieren. Vielleicht sollten Sie den Rechner neu starten oder zumindest den Apache neu starten, um die PHP-Prozessinformationen zu aktualisieren. – maxhb

+0

Neustart hilft nicht. Session save_path ist auf:/var/lib/php5/sessions gesetzt Diese Fehler treten nicht jedes Mal auf (Sessionclean läuft alle 30 Minuten und diese Fehler erscheinen manchmal mehrmals am Tag, manchmal nur einmal in mehreren Tagen). Darüber hinaus verwenden die meisten Skripts benutzerdefinierte Session-Handler, was bedeutet, Sitzungen Ordner ist fast immer leer –

Antwort

1

Sie können diese Fehler ignorieren, die sessionclean Suche nach Sitzung an eine nicht mehr vorhandene PID angefügt.

[ -x /usr/lib/php5/sessionclean ] && /usr/lib/php5/sessionclean 2>/dev/null 

Sie sollten in Ihrem Session-Verzeichnis schauen, dass sie, weil eine solche Nachricht von einer zu langen Verarbeitungs sein könnte symptomatisch gereinigt richtig zu überprüfen.

+0

Danke für Ihre Antwort. Ich möchte diese Fehler nicht unterdrücken, um benachrichtigt zu werden, wenn etwas mit dem Skript nicht stimmt. Sitzungsordner wird korrekt bereinigt und ist fast immer leer, da die meisten Skripts den benutzerdefinierten Sitzungshandler verwenden. Ich überprüfte den Inhalt des Ordners - er enthält aktuelle Sitzungsdateien und hat normalerweise nur ein paar Dateien. Ich frage mich, was ist die wahre Ursache für dieses Problem und wie man es löst (anstatt den Fehler zu unterdrücken) ... –

+0

Es ist nichts falsch: Der Prozess wurde während der Ausführung des Sessionclean-Skript beendet. Wenn Sie keinen anderen Fehler unterdrücken möchten, müssen Sie das Skript ändern. – Adam

+0

@Adam Ich bekomme dieses Problem auch, aber ich weiß nicht, was ich davon halten soll. In /etc/php5/apache2/php.ini habe ich keinen 'save_path', aber in/var/lib/php5/sessions gibt es 2 Session-Dateien, die vor ein paar Stunden datiert wurden. Ich denke, sie sollten dort sein, aber ich weiß nicht, wie ich sicher sein kann. Auch die xxxx in '/ proc/xxxx/fd' sind konsistent für aktive apache2-Prozesse. Ich bin mir nicht sicher, was ich denken soll. – Opux

0

Ich fand einen Weg, um die Fehler zu beseitigen, obwohl alle Wetten aus sind, ob Sie ein Problem beseitigen oder es nur maskieren. Ich habe mehrere Container laufen, und einige haben dieses Problem, andere nicht.

Das Verzeichnis/usr/lib/php5/sessionclean, der den Fehler generiert wird:

#!/bin/sh -e 

SAPIS="apache2:apache2\napache2filter:apache2\ncgi:php5\nfpm:php5-fpm\n" 

# Iterate through all web SAPIs 
(
printf "$SAPIS" | { \ 
proc_names="" 
while IFS=: read -r conf_dir proc_name; do 
    if [ -e /etc/php5/${conf_dir}/php.ini ]; then 
     # Get all session variables once so we don't need to start PHP to get each config option 
     session_config=$(php5 -c /etc/php5/${conf_dir}/php.ini -d "error_reporting='~E_ALL'" -r 'foreach(ini_get_all("session") as $k => $v) echo "$k=".$v["local_value"]."\n";') 
     save_handler=$(echo "$session_config" | sed -ne 's/^session\.save_handler=\(.*\)$/\1/p') 
     save_path=$(echo "$session_config" | sed -ne 's/^session\.save_path=\(.*\)$/\1/p') 
     gc_maxlifetime=$(($(echo "$session_config" | sed -ne 's/^session\.gc_maxlifetime=\(.*\)$/\1/p')/60)) 

     if [ "$save_handler" = "files" -a -d "$save_path" ]; then 
      proc_names="$proc_names $proc_name"; 
      printf "%s:%s\n" "$save_path" "$gc_maxlifetime" 
     fi 
    fi 
done 
# first find all open session files and touch them (hope it's not massive amount of files) 
for pid in $(pidof $proc_names); do 
    find "/proc/$pid/fd" -ignore_readdir_race -lname "$save_path/sess_\*" -exec touch -c {} \; 
done 
}) | sort -rn -t: -k2,2 | sort -u -t: -k 1,1 | while IFS=: read -r save_path gc_maxlifetime; do 
    # find all files older then maxlifetime and delete them 
    find -O3 "$save_path" -depth -mindepth 1 -name 'sess_*' -ignore_readdir_race -type f -cmin "+$gc_maxlifetime" -delete 
done 

exit 0 

Aber wenn ich ersetzen, dass w/a/usr/lib/php5/sessionclean aus einem Behälter, der nicht der Fall ist den Fehler erzeugen, der ist:

#!/bin/sh -e 

SAPIS="apache2:apache2\napache2filter:apache2\ncgi:php5\nfpm:php5-fpm\n" 

# Iterate through all web SAPIs 
(
proc_names="" 
printf "$SAPIS" | \ 
while IFS=: read -r conf_dir proc_name; do 
    if [ -e /etc/php5/${conf_dir}/php.ini ]; then 
     # Get all session variables once so we don't need to start PHP to get each config option 
     session_config=$(php5 -c /etc/php5/${conf_dir}/php.ini -d "error_reporting='~E_ALL'" -r 'foreach(ini_get_all("session") as $k => $v) echo "$k=".$v["local_value"]."\n";') 
     save_handler=$(echo "$session_config" | sed -ne 's/^session\.save_handler=\(.*\)$/\1/p') 
     save_path=$(echo "$session_config" | sed -ne 's/^session\.save_path=\(.*\)$/\1/p') 
     gc_maxlifetime=$(($(echo "$session_config" | sed -ne 's/^session\.gc_maxlifetime=\(.*\)$/\1/p')/60)) 

     if [ "$save_handler" = "files" -a -d "$save_path" ]; then 
      proc_names="$proc_names $proc_name"; 
      printf "%s:%s\n" "$save_path" "$gc_maxlifetime" 
     fi 
    fi 
done 
# first find all open session files and touch them (hope it's not massive amount of files) 
for pid in $(pidof $proc_names); do 
    find "/proc/$pid/fd" -ignore_readdir_race -lname "$save_path/sess_\*" -exec touch -c {} \; 
done 
) | sort -rn -t: -k2,2 | sort -u -t: -k 1,1 | while IFS=: read -r save_path gc_maxlifetime; do 
    # find all files older then maxlifetime and delete them 
    find -O3 "$save_path" -depth -mindepth 1 -name 'sess_*' -ignore_readdir_race -type f -cmin "+$gc_maxlifetime" -delete 
done 

exit 0 

Dann bekomme ich die Fehler nicht.

2

Es ist jetzt ein Debian-Fehler gemeldet (und fixed) darüber.

Es erwähnt um eine Freisetzung zu stabil:

Im nächsten Sicherheits hoch laden, zum Beispiel ungefähr zwei Wochen nach 5.6.23 wird freigegeben, sofern nicht etwas anderes kritisch auftaucht.

5.6.23 ist out, also erwarte ich es innerhalb der nächsten zwei Wochen.

Das Update ist es

if [ -d "/proc/$pid/fd" ]; then 

vor dem

find "/proc/$pid/fd" 

Befehl hinzuzufügen.