Cron sessionclean errors: find: `/ proc / xxxxx / fd ': no ​​such file or directory

After updating PHP, I started getting the following cron errors several times a day:

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

This comes from the work of the PHP sessionclean cron:

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

Any ideas?

+8
php find cron session
source share
3 answers

A Debian (and fixed ) error is now reported.

It mentions a release to stable:

In the next security boot, for example. about two weeks after 5.6.23 is released if something else important doesn't appear.

5.6.23 is missing, so I expect it in the next two weeks.

Fixed add

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

before

 find "/proc/$pid/fd" 

teams.

+2
source share

You can ignore these errors, sessionclean look for a session attached to an already missing pid.

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

You should look inside your session directory to make sure they are cleaned correctly, because such a message may be a symptom of processing too long.

+1
source share

I found a way to fix errors, although all bets are not taken into account, whether you fix the problem or simply mask it. I have several containers, and some of them have this problem, while others do not.

The failure of / usr / lib / php5 / sessionclean, which will generate an error:

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

But if I replaced this w / a / usr / lib / php5 / sessionclean from a container that does not generate an error, that is:

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

Then I do not get errors.

0
source share

All Articles