#!/bin/bash

set -eu
__SILENT=TRUE
[ "${__DEBUG:-}" = TRUE ] \
	&& { set +x; __DEBUG=FALSE; }

. /opt/fox_utils/crab_sys.sh
[ "${1:-}" = "--help" ] && sys::usage "$@"
### --help Info: lsof падает часто, этот помогает
### --help Usage: crab_lsof $DIR [--pid] [--kill]
### --help -t show pid only
### --help -k kill pids
### --help Example:
sys::arg_parse "$@"
ARG_FILE=`readlink -f $ARG_1`
lsof -t "$ARG_FILE" >/tmp/crab_lsof.$$ || true

for f in /proc/[0-9]*/fd/* /proc/[0-9]*/exe; do
	pid=${f//'/proc/'}
	pid=${pid%%/*}
	proc_file=`readlink $f` && true || proc_file=""
	if [[ "$proc_file" == "$ARG_FILE"* ]]; then
		echo $pid >> /tmp/crab_lsof.$$
	fi
done

sort /tmp/crab_lsof.$$ | uniq > /tmp/crab_lsof.uniq.$$

while read -r pid; do
	echo -n $pid
	[ "${ARG_PID:-}" != 'TRUE' ] && echo -n " `readlink /proc/$pid/exe`"
	if [ "${ARG_KILL:-}" = 'TRUE' ]; then
		echo " kill `readlink /proc/$pid/exe`"
		kill -TERM $pid &>/dev/null || true
		usleep 50000
		kill -KILL $pid &>/dev/null || true
	fi
	echo
done < /tmp/crab_lsof.uniq.$$

rm -f /tmp/crab_lsof.$$
rm -f /tmp/crab_lsof.uniq.$$

exit 0
