Bash cкрипт получения числа открытых файлов пользователя
Данный скрипт позволяет узнать сколько открытых файлов у определённого пользователя Linux. Это бывает необходимо для отладки службы, работающей под определённым пользователем.
В качестве параметра скрипту необходимо передать имя или uid пользователя.
Скрипт будем использовать следующими способами:
./openfiles.sh -h — показать справку;
./openfiles.sh <имя_или_uid> — показать число открытых файлов.
Вот сам скрипт:
Код:
#!/bin/bash
case "$1" in
-h)
echo -e "Скрипт покажет открытые файлы для выбранного пользователя.
Опции:
-h показать эту справку.
Примеры выполнения:
./files2.sh <username>
./files2.sh <uid>"
;;
*)
if [[ "$#" -eq 1 ]];
then
id "$1" >/dev/null 2>&1
if [[ $? -ne 0 ]]; then
echo 'Пользователь не найден!'
exit 1
fi
for pid in `ps -u "$1" -o pid,comm | grep -v PID | awk '{print $1}'`
do
open_files=`ls -l /proc/$pid/fd | grep "anon_inode" | wc -l`
echo "Открытых файлов для pid $pid: $open_files"
done
else
echo -e "Забыли указать имя или id пользователя!
Или ввели больше одного параметра.
Для справки выполните $0 -h"
fi
;;
esac
Если скрипт получит параметр -h, то с помощью echo просто выведет справку.
Если скрипт получит всего один любой другой параметр, то он будет считаться именем пользователя. В этом случае, если такого пользователя в системе не будет, то скрипт скажет об этом.
Если скрипт получит не 1, а больше или меньше параметров, то эта ситуация также будет обработана.
Весь код по получению открытых файлов заключен в этих строчках:
Код:
for pid in `ps -u "$1" -o pid,comm | grep -v PID | awk '{print $1}'`
do
open_files=`ls -l /proc/$pid/fd | grep "anon_inode" | wc -l`
echo "Открытых файлов для pid $pid: $open_files"
done
То есть мы пробегаемся по всем процессам данного пользователя, и для каждого процесса (pid) вычисляем количество открытых файлов.