59 lines
2.9 KiB
Bash
Executable File
59 lines
2.9 KiB
Bash
Executable File
#!/bin/sh -e
|
|
#
|
|
# sessionclean - a script to cleanup stale PHP sessions
|
|
#
|
|
# Copyright 2013-2015 Ondřej Surý <ondrej@sury.org>
|
|
#
|
|
# Permission is hereby granted, free of charge, to any person obtaining a copy of
|
|
# this software and associated documentation files (the "Software"), to deal in
|
|
# the Software without restriction, including without limitation the rights to
|
|
# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
|
# the Software, and to permit persons to whom the Software is furnished to do so,
|
|
# subject to the following conditions:
|
|
#
|
|
# The above copyright notice and this permission notice shall be included in all
|
|
# copies or substantial portions of the Software.
|
|
#
|
|
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
|
# FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
|
# COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
|
# IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
|
|
SAPIS="apache2:apache2 apache2filter:apache2 cgi:php@VERSION@ fpm:php-fpm@VERSION@ cli:php@VERSION@"
|
|
|
|
# Iterate through all web SAPIs
|
|
(
|
|
proc_names=""
|
|
for version in $(/usr/sbin/phpquery -V); do
|
|
for sapi in ${SAPIS}; do
|
|
conf_dir=${sapi%%:*}
|
|
proc_name=${sapi##*:}
|
|
if [ -e "/etc/php/${version}/${conf_dir}/php.ini" ] && [ -x "/usr/bin/php${version}" ]; then
|
|
# Get all session variables once so we don't need to start PHP to get each config option
|
|
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";')
|
|
save_handler=$(echo "$session_config" | sed -ne 's/^session\.save_handler=\(.*\)$/\1/p')
|
|
save_path=$(echo "$session_config" | sed -ne 's/^session\.save_path=\(.*;\)\?\(.*\)$/\2/p')
|
|
gc_maxlifetime=$(($(echo "$session_config" | sed -ne 's/^session\.gc_maxlifetime=\(.*\)$/\1/p')/60))
|
|
|
|
if [ "$save_handler" = "files" ] && [ -d "$save_path" ]; then
|
|
proc_names="$proc_names $(echo "$proc_name" | sed -e "s,@VERSION@,$version,")";
|
|
printf "%s:%s\n" "$save_path" "$gc_maxlifetime"
|
|
fi
|
|
fi
|
|
done
|
|
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 {} \; 2>/dev/null
|
|
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/" -ignore_readdir_race -depth -mindepth 1 -name 'sess_*' -type f -cmin "+$gc_maxlifetime" -delete
|
|
done
|
|
|
|
exit 0
|