2015-11-01 5 views
8

पीएचपी अपग्रेड करने के बाद मैं निम्नलिखित क्रॉन त्रुटियों दिन में कई बार पाने के लिए शुरू कर दिया sessionclean cron job:क्रॉन sessionclean त्रुटियों: लगता है: `/ proc/xxxxx/fd ':</p> <pre><code>find: `/proc/xxxxx/fd': No such file or directory </code></pre> <p>यह पीएचपी से आता है: ऐसा कोई फ़ाइल या निर्देशिका

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

कोई विचार?

+0

क्या आपने इसे होस्ट करने वाली मशीन को पुनरारंभ करने का प्रयास किया है? ;) क्या आप 'session.save_path' कॉन्फ़िगरेशन के पथ की पुष्टि भी कर सकते हैं? –

+0

sessionclean गैर मौजूदा PHP प्रक्रियाओं के लिए सत्र अपडेट करने का प्रयास करता है। शायद आपको मशीन को पुनरारंभ करना चाहिए या कम से कम PHP प्रक्रिया जानकारी अद्यतन करने के लिए apache को पुनरारंभ करना चाहिए। – maxhb

+0

पुनरारंभ करने में मदद नहीं करता है। सत्र save_path को सेट किया गया है:/var/lib/php5/सत्र ये त्रुटियां हर बार नहीं होती हैं (sessionclean हर 30 मिनट में चलता है और यह त्रुटियां कभी-कभी कई बार दिखाई देती हैं, कभी-कभी कई दिनों में केवल एक बार)। इस स्क्रिप्ट के अलावा कस्टम सत्र हैंडलर का उपयोग करें जिसका अर्थ है कि सत्र फ़ोल्डर लगभग हमेशा खाली होता है –

उत्तर

1

आप उन त्रुटियों को अनदेखा कर सकते हैं, sessionclean अब मौजूदा पिड से जुड़े सत्र के लिए खोज।

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

आपको यह देखने के लिए अपनी सत्र निर्देशिका में देखना चाहिए कि वे सही तरीके से साफ हैं क्योंकि ऐसा संदेश बहुत लंबे समय तक प्रसंस्करण का लक्षण हो सकता है।

+0

अपने उत्तर के लिए धन्यवाद। मैं स्क्रिप्ट के साथ कुछ गलत होने पर इन त्रुटियों को अधिसूचित करने के लिए दबाने की इच्छा नहीं करता हूं। सत्र फ़ोल्डर सही ढंग से साफ़ किया जाता है और लगभग हमेशा खाली होता है क्योंकि अधिकांश स्क्रिप्ट कस्टम सत्र हैंडलर का उपयोग करती हैं। मैंने फ़ोल्डर की सामग्री की जांच की - इसमें वर्तमान सत्र फाइलें होती हैं और आमतौर पर केवल कुछ फाइलें होती हैं। मुझे आश्चर्य है कि इस समस्या का वास्तविक कारण क्या है और इसे कैसे हल करें (त्रुटि को दबाने के बजाए) ... –

+0

कुछ भी गलत नहीं है: प्रक्रिया सत्र स्क्रिप्ट के निष्पादन के दौरान समाप्त हो गई है। यदि आप किसी अन्य त्रुटि को दबाना नहीं चाहते हैं, तो आपको स्क्रिप्ट को संशोधित करना होगा। – Adam

+0

@Adam मुझे यह समस्या भी मिल रही है, लेकिन यह नहीं पता कि इसके बारे में क्या सोचना है। /etc/php5/apache2/php.ini में मेरे पास 'save_path' नहीं है, लेकिन/var/lib/php5/सत्रों में दो घंटे पहले 2 सत्र फ़ाइलें हैं। मुझे लगता है कि वे वहां होना चाहिए, लेकिन मुझे नहीं पता कि कैसे सुनिश्चित किया जाए। साथ ही, xxxx '/ proc/xxxx/fd' में सक्रिय apache2 प्रक्रियाओं के लिए लगातार हैं। मुझे यकीन नहीं है कि क्या सोचना है। – Opux

0

मुझे त्रुटियों को खत्म करने का एक तरीका मिला, हालांकि, सभी दांव इस बात से दूर हैं कि आप किसी समस्या को खत्म कर रहे हैं या बस इसे मास्क कर रहे हैं। मेरे पास कई कंटेनर चल रहे हैं, और कुछ को यह समस्या है जबकि अन्य नहीं हैं।

/usr/lib/PHP5/sessionclean कि त्रुटि उत्पन्न होगा है:

#!/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 

लेकिन अगर मैं की जगह है कि डब्ल्यू एक/usr/lib/PHP5/sessionclean/एक कंटेनर जो ऐसा नहीं करता से त्रुटि उत्पन्न करें, जो है:

#!/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 

तब मुझे त्रुटियां नहीं मिलतीं।

2

अब इस बारे में एक डेबियन बग रिपोर्ट किया गया है (और fixed)।

यह स्थिर करने के लिए एक रिलीज के बारे में उल्लेख है:

अगले सुरक्षा अपलोड में, उदाहरण के लिए 5.6.23 के बाद लगभग दो सप्ताह जारी किए गए, जब तक कि कुछ और महत्वपूर्ण दिखाई न दे।

5.6.23 बाहर है, इसलिए मैं अगले दो सप्ताह में इसकी अपेक्षा करता हूं।

ठीक वहाँ

find "/proc/$pid/fd" 

आदेश से पहले

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

जोड़ना है।

संबंधित मुद्दे