Работа с файловыми дескрипторами.

Работа с файловыми дескрипторами.

Предположим, есть проблема с разрастанием файла /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

Добавить комментарий