Найти самые старые файлы / каталоги в файловой системе размером до 50 ТБ

Для давно запущенных процессов иногда полезно знать, какой я использую следующее:

  1. Используйте ps, чтобы найти идентификатор процесса запущенной программы (PID ниже);
  2. используйте lsof, чтобы найти файл, в который записывается вывод:

    lsof -p PID
    

В выводе найдите строки 1u и 2u под заголовком столбца FD.

Эти строки скажут вам, в какие временные файлы попадает вывод процесса перед отправкой по почте. Обычно, для at, файл расположен в /var/spool/cron/atjobs/. Наконец, отобразите этот файл и вы увидите вывод вашего процесса (текущий).

8
13.03.2017, 15:39
2 ответа

Команда 'ls' несколько творчески относится к временным меткам - поэтому их разбор может стать проблемой. Вероятно, было бы гораздо проще реализовать это в языке, реализующем stat(). В некоторых версиях Unix есть командная строка stat - на соседнем ящике RH:

 find ${BASEDIR} -type f -exec stat --format="%y %b %n" {} \; | sort | less

Но она будет работать как собака при большом количестве файлов.

В документации к GNU awk есть пример расширения, предоставляющего функции файловой системы, но вам придется проделать некоторую работу по его созданию и поддержке.

Написание программы с нуля на PHP, C или Perl (или go, ruby или многих других языках) будет несложным, но выходит за рамки данной статьи.

2
27.01.2020, 20:11

С помощью инструментов GNU и rsync вы могли бы сделать:

export LC_ALL=C # force tools to regard those file paths as arrays
                # of bytes (as they are in effect) and not do fancy
                # sorting (and use English for error/warning messages 
                # as an undesired side effect).

find . -type f -printf '%T@/%s/%p\0' | # print mtime/size/path
  sort -zn | # numerical sort, oldest first
  awk -v RS='\0' -v ORS='\0' -F / -v max=50e12 '
    {total_size += $2}
    total_size > max {exit}
    {
      sub("^[^/]*/[^/]*/", "") # remove mtime/size/
      print # path
    }' |
  rsync -nv -aHAX0 --files-from=- --remove-source-files . /dest/dir/

(не проверено. -n - для пробного запуска. Удалите, если все устраивает ).

Обратите внимание, что мы вычисляем совокупный размер файла на основе размеров файлов (% s , замените на % b для использования диска в секторах (и измените на ] total_size + = $ 2 * 512 ) и игнорирование жестких ссылок. Эти файлы при копировании в целевую файловую систему вместе с каталогами, которые их содержат, вероятно, в конечном итоге будут занимать более 50 ТБ (если нет сжатия файловой системы или дедупликации. в игре).

9
27.01.2020, 20:11

Теги

Похожие вопросы