sessionclean-fpm 4.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. #!/bin/sh -e
  2. #
  3. # sessionclean - a script to cleanup stale PHP sessions
  4. #
  5. # Copyright 2013-2015 Ondřej Surý <ondrej@sury.org>
  6. #
  7. # Permission is hereby granted, free of charge, to any person obtaining a copy of
  8. # this software and associated documentation files (the "Software"), to deal in
  9. # the Software without restriction, including without limitation the rights to
  10. # use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
  11. # the Software, and to permit persons to whom the Software is furnished to do so,
  12. # subject to the following conditions:
  13. #
  14. # The above copyright notice and this permission notice shall be included in all
  15. # copies or substantial portions of the Software.
  16. #
  17. # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  18. # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
  19. # FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
  20. # COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
  21. # IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
  22. # CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  23. SAPIS="fpm:php-fpm@VERSION@"
  24. # Iterate through all web SAPIs
  25. (
  26. proc_names=""
  27. for version in $(/usr/sbin/phpquery -V); do
  28. for sapi in ${SAPIS}; do
  29. conf_dir=${sapi%%:*}
  30. proc_name=${sapi##*:}
  31. if [ -e "/etc/php/${version}/${conf_dir}/php.ini" ] && [ -x "/usr/bin/php${version}" ]; then
  32. for pool in /etc/php/${version}/${conf_dir}/pool.d/*.conf; do
  33. # Get all session variables once so we don't need to start PHP to get each config option
  34. session_config=$(PHP_INI_SCAN_DIR=/etc/php/${version}/${conf_dir}/conf.d/ "/usr/bin/php${version}" -c "/etc/php/${version}/${conf_dir}/php.ini" -d "error_reporting='~E_ALL'" -r 'foreach(ini_get_all("session") as $k => $v) echo "$k=".$v["local_value"]."\n";')
  35. #default session path
  36. save_handler=$(echo "$session_config" | sed -ne 's/^session\.save_handler=\(.*\)$/\1/p')
  37. save_path=$(echo "$session_config" | sed -ne 's/^session\.save_path=\(.*;\)\?\(.*\)$/\2/p')
  38. gc_maxlifetime=$(($(echo "$session_config" | sed -ne 's/^session\.gc_maxlifetime=\(.*\)$/\1/p')/60))
  39. sh_ok=$(grep "session\.save_handler" "${pool}" | egrep -v "^[;#]" )
  40. sp_ok=$(grep "session\.save_path" "${pool}" | egrep -v "^[;#]")
  41. sg_ok=$(grep "session\.gc_maxlifetime" "${pool}" | egrep -v "^[;#]")
  42. if [ -n "${sh_ok}" ]; then
  43. save_handler=$(grep "session\.save_handler" "${pool}" | egrep -v "^[;#]" | awk -F "=" '{ print $NF }' | sed 's/^\s*//g')
  44. fi
  45. if [ -n "${sp_ok}" ]; then
  46. save_path=$(grep "session\.save_path" "${pool}" | egrep -v "^[;#]" | awk -F "=" '{ print $NF }' | sed 's/^\s*//g')
  47. fi
  48. if [ -n "${sg_ok}" ]; then
  49. gc_maxlifetime=$(($(grep "session\.gc_maxlifetime" "${pool}" | egrep -v "^[;#]" | awk -F "=" '{ print $NF }' | sed 's/^\s*//g')/60))
  50. fi
  51. if [ "$save_handler" = "files" ] && [ -d "$save_path" ]; then
  52. proc_names="$proc_names $(echo "$proc_name" | sed -e "s,@VERSION@,$version,")";
  53. printf "%s:%s\n" "$save_path" "$gc_maxlifetime"
  54. fi
  55. done
  56. fi
  57. done
  58. done
  59. # first find all open session files and touch them (hope it's not massive amount of files)
  60. for pid in $(pidof $proc_names); do
  61. find "/proc/$pid/fd" -ignore_readdir_race -lname "$save_path/sess_*" -exec touch -c {} \; 2>/dev/null
  62. done ) | \
  63. sort -rn -t: -k2,2 | \
  64. sort -u -t: -k 1,1 | \
  65. while IFS=: read -r save_path gc_maxlifetime; do
  66. # find all files older then maxlifetime and delete them
  67. [ -z "${save_path}" ] && continue
  68. find -O3 "$save_path/" -ignore_readdir_race -depth -mindepth 1 -name 'sess_*' -type f -cmin "+$gc_maxlifetime" -delete
  69. done
  70. exit 0