2015-11-01 85 views
8

PHP升級後,我開始了一天得到以下的cron錯誤幾次:的Cron sessionclean錯誤:找:`/ proc中/ XXXXX/FD':沒有這樣的文件或目錄

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

它來自PHP sessionclean cron作業:

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

任何想法?

+0

您是否嘗試過重新啓動託管此計算機的計算機? ;)你也可以確認'session.save_path'配置的路徑嗎? –

+0

sessionclean嘗試更新非現有php進程的會話。也許你應該重啓機器,或者至少重啓apache來更新php進程信息。 – maxhb

+0

重新啓動不起作用。會話save_path設置爲:/ var/lib/php5/sessions 這些錯誤不會每次都發生(會話每30分鐘運行一次,這種錯誤有時每天幾次出現,有時候幾天只出現一次)。 除了這個大多數腳本使用自定義會話處理程序,這意味着會話文件夾幾乎總是空的 –

回答

1

您可以忽略這些錯誤,sessionclean搜索連接到不再存在的pid的會話。

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

您應該查看您的會話目錄內部以檢查它們是否被正確清理,因爲此類消息可能是過長處理的症狀。

+0

感謝您的回覆。如果腳本出現問題,我寧願不要禁止通知這些錯誤。 會話文件夾被正確清理並且幾乎總是空的,因爲大多數腳本都使用自定義會話處理程序。我檢查了文件夾的內容 - 它包含當前的會話文件,通常只有幾個文件(如果有的話)。 我不知道這個問題的真正原因是什麼,以及如何解決它(而不是抑制錯誤)...... –

+0

沒有什麼錯誤:在執行sessionclean腳本期間,流程已經完成。如果您不想抑制任何其他錯誤,那麼您必須修改腳本。 – Adam

+0

@Adam我也遇到了這個問題,但不知道該怎麼想。在/etc/php5/apache2/php.ini中,我沒有'save_path',但在/ var/lib/php5/sessions中有兩個會話文件是在幾個小時前發佈的。我認爲他們應該在那裏,但我不知道如何確定。另外,'/ proc/xxxx/fd'中的xxxx對於活動的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 

但如果我更換W/A/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

現在有一個Debian bug報告(和fixed)。

它提到關於釋放穩定:

在未來的安全上傳,例如大約兩個星期後,5.6.23發佈了 ,除非出現其他關鍵問題。

5.6.23出來了,所以我期待在接下來的兩週內。

的修復存在

find "/proc/$pid/fd" 

命令之前添加

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

相關問題