#!/bin/sh

# TODO:
#   - документация
#   - переписать на python

if [ "$1" = "--list" ]; then
    do_list=1
fi

log_msg() {
    if [ -z "$do_list" ]; then
        printf %s\\n "$1"
    fi
}

log_msg "$(date +"%Y-%m-%d %H:%M:%S") started"
log_msg "  $(date +"%Y-%m-%d %H:%M:%S") looking for orphaned mysql processes"
pgrep mysqld | while read mysql_pid; do
    java_pid=$(strings /proc/$mysql_pid/environ | grep '^DIRECT_.*_PID=' | cut -d= -f2)
    if [ -z "$java_pid" ]; then
        continue
    fi
    if test \! -d "/proc/$java_pid" || expr `awk '{print $22}' /proc/$mysql_pid/stat` \< `awk '{print $22}' /proc/$java_pid/stat` > /dev/null
    then
        datadir=$(strings /proc/$mysql_pid/cmdline | grep ^--datadir= | cut -d= -f2)
        mysql_dir=$(dirname "$datadir")
        if [ "$do_list" = 1 ]; then
            printf "%s\n" "$mysql_pid"
        else
            log_msg "killing process: $mysql_pid that runs on datadir: $datadir"
            kill "$mysql_pid"
            for i in `seq 1 5`; do
                kill -0 "$mysql_pid" 2>/dev/null || break
                sleep 1
            done
            if [ -n "$mysql_dir" ] && ( printf %s "$mysql_dir" | grep -qE '^(/tmp|/dev/shm|/local/cache)/mysql' ); then
                log_msg "removing dir: '$mysql_dir'"
                rm -rf "$mysql_dir" 
            else
                log_msg "unexpected mysql dir path, not removing: '$mysql_dir'"
            fi
        fi
    fi
done
log_msg "  $(date +"%Y-%m-%d %H:%M:%S") looking for mysql dirs that are no longer used"
lsof_cache_file=$(mktemp -t lsofXXXXXXX).gz
lsof -lnP -Fn | grep mysql | sort | uniq | gzip >$lsof_cache_file
for dir in /tmp/mysql-* /dev/shm/mysql-* /local/cache/mysql-*; do
    if [ ! -d "$dir" ]; then
        continue
    fi
    recently_changed_file=`find "$dir" -type f -mmin 30 | sed 1q`
    # отсеиваем директории, созданные "только что", на которых ещё не успел запуститься mysql
    if [ -n "$recently_changed_file" ]; then
        continue
    fi
    if zgrep --quiet --fixed-strings -- "$dir" $lsof_cache_file; then
        continue
    fi
    # пока не убедились в надёжности способа обнаружения, не удаляем
    log_msg "mysql dir '$dir' is unused. Not removing for now"
done
rm $lsof_cache_file
log_msg "$(date +"%Y-%m-%d %H:%M:%S") finished"
