Работа с файловыми дескрипторами.
Предположим, есть проблема с разрастанием файла /var/log/squid/access.log
В данном случае понятно, что лог-файл принадлежит процессу squid, в общем случае это может быть не очевидно.
Для определения принадлежности файла процессу используется команда lsof
:
# lsof | grep /var/log/squid/access.log squid 728 proxy 10w REG 9,0 5724 1049202 /var/log/squid/access.log
На выходе узнаём, что процесс имеет ID равным 728, владелец proxy, размер файла 1049202.
Зная идентификатор процесса становится возможным получить файловые дескрипторы:
# ls -lah /proc/728/fd итого 0 dr-x------ 2 proxy proxy 0 мар 28 11:29 . dr-xr-xr-x 9 proxy proxy 0 мар 20 18:05 .. lrwx------ 1 proxy proxy 64 мар 28 11:29 0 -> /dev/null lrwx------ 1 proxy proxy 64 мар 28 11:29 1 -> /dev/null l-wx------ 1 proxy proxy 64 мар 28 11:29 10 -> /var/log/squid/access.log lr-x------ 1 proxy proxy 64 мар 28 11:29 11 -> 'pipe:[17692]' lrwx------ 1 proxy proxy 64 мар 28 11:29 12 -> /var/log/squid/cache.log l-wx------ 1 proxy proxy 64 мар 28 11:29 14 -> 'pipe:[17693]' lrwx------ 1 proxy proxy 64 мар 28 11:29 17 -> 'socket:[17697]' lrwx------ 1 proxy proxy 64 мар 28 11:29 18 -> 'socket:[276519]' lrwx------ 1 proxy proxy 64 мар 28 11:29 19 -> 'socket:[276520]' lrwx------ 1 proxy proxy 64 мар 28 11:29 2 -> /dev/null lrwx------ 1 proxy proxy 64 мар 28 11:29 3 -> /dev/null lrwx------ 1 proxy proxy 64 мар 28 11:29 4 -> '/var/log/squid/cache.log.1 (deleted)' l-wx------ 1 proxy proxy 64 мар 28 11:29 5 -> /var/spool/squid/swap.state lrwx------ 1 proxy proxy 64 мар 28 11:29 6 -> 'socket:[17680]' lrwx------ 1 proxy proxy 64 мар 28 11:29 7 -> 'anon_inode:[eventpoll]' lrwx------ 1 proxy proxy 64 мар 28 11:29 8 -> 'socket:[17690]' lrwx------ 1 proxy proxy 64 мар 28 11:29 9 -> 'socket:[17691]'
В Linux библиотека libc открывает для каждого запущенного приложения(процесса) 3 файл дескриптора, с номерами 0,1,2.
- Файл дескриптор 0 называется STDIN и ассоциируется с вводом данных у приложения
- Файл дескриптор 1 называется STDOUT и используется приложениями для вывода данных, например командами print
- Файл дескриптор 2 называется STDERR и используется приложениями для вывода данных, сообщающих об ошибке
В контексте задачи меня будет интересовать дескриптор с номер 10.
С помощью команды truncate можно «обнулить» размер файла не удаляя его:
# truncate -s 0 /proc/728/fd/10
Проверяю результат:
# lsof | grep /var/log/squid/access.log squid 728 proxy 10w REG 9,0 0 1049202 /var/log/squid/access.log
или
# ls -l /var/log/squid/access.log -rw-r----- 1 proxy proxy 0 мар 28 13:57 /var/log/squid/access.log
Добавить комментарий