Данный скрипт позволяет узнать сколько открытых файлов у определённого пользователя Linux. Это бывает необходимо для отладки службы, работающей под определённым пользователем.
В качестве параметра скрипту необходимо передать имя или uid пользователя.
Скрипт будем использовать следующими способами:
- ./openfiles.sh -h — показать справку;
- ./openfiles.sh <имя_или_uid> — показать число открытых файлов.
Вот сам скрипт (удобнее нажать кнопочку «extern«):
#!/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) вычисляем количество открытых файлов. Подробнее о таких циклах я уже писал в статье «Обработка строк циклом «for line in comand»«
# ./files2.sh 1000 Открытых файлов для pid 600: 6 Открытых файлов для pid 618: 6 Открытых файлов для pid 878: 2274 Открытых файлов для pid 1112: 3
* * *
Если есть замечания по улучшению этого скрипта, пишите в комментариях!