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
任何想法?
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
任何想法?
您可以忽略這些錯誤,sessionclean
搜索連接到不再存在的pid的會話。
[ -x /usr/lib/php5/sessionclean ] && /usr/lib/php5/sessionclean 2>/dev/null
您應該查看您的會話目錄內部以檢查它們是否被正確清理,因爲此類消息可能是過長處理的症狀。
感謝您的回覆。如果腳本出現問題,我寧願不要禁止通知這些錯誤。 會話文件夾被正確清理並且幾乎總是空的,因爲大多數腳本都使用自定義會話處理程序。我檢查了文件夾的內容 - 它包含當前的會話文件,通常只有幾個文件(如果有的話)。 我不知道這個問題的真正原因是什麼,以及如何解決它(而不是抑制錯誤)...... –
沒有什麼錯誤:在執行sessionclean腳本期間,流程已經完成。如果您不想抑制任何其他錯誤,那麼您必須修改腳本。 – Adam
@Adam我也遇到了這個問題,但不知道該怎麼想。在/etc/php5/apache2/php.ini中,我沒有'save_path',但在/ var/lib/php5/sessions中有兩個會話文件是在幾個小時前發佈的。我認爲他們應該在那裏,但我不知道如何確定。另外,'/ proc/xxxx/fd'中的xxxx對於活動的apache2進程是一致的。我不知道該怎麼想。 – Opux
我發現了一種消除錯誤的方法,儘管所有的賭注都是關於你是在消除一個問題還是僅僅掩蓋它。我有幾個容器在運行,有些有這個問題,有些則沒有。
的/ 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
然後我沒有得到錯誤。
現在有一個Debian bug報告(和fixed)。
它提到關於釋放穩定:
在未來的安全上傳,例如大約兩個星期後,5.6.23發佈了 ,除非出現其他關鍵問題。
5.6.23出來了,所以我期待在接下來的兩週內。
的修復存在
find "/proc/$pid/fd"
命令之前添加
if [ -d "/proc/$pid/fd" ]; then
。
您是否嘗試過重新啓動託管此計算機的計算機? ;)你也可以確認'session.save_path'配置的路徑嗎? –
sessionclean嘗試更新非現有php進程的會話。也許你應該重啓機器,或者至少重啓apache來更新php進程信息。 – maxhb
重新啓動不起作用。會話save_path設置爲:/ var/lib/php5/sessions 這些錯誤不會每次都發生(會話每30分鐘運行一次,這種錯誤有時每天幾次出現,有時候幾天只出現一次)。 除了這個大多數腳本使用自定義會話處理程序,這意味着會話文件夾幾乎總是空的 –