Отслеживание, на котором дисковое пространство осталось на Linux?

При администрировании систем Linux я часто обнаруживаю, что изо всех сил пытаюсь выследить виновника после того, как раздел переполнен. Обычно я использую du / | sort -nr, но в большой файловой системе это занимает много времени, прежде чем будут возвращены какие-либо результаты.

Кроме того, это обычно успешно выделяет худшего нарушителя, но я часто обнаружил, что прибегаю к du без sort в более тонких случаях, а затем пришлось тралить через выход.

Я бы предпочел решение командной строки, которое основывается на стандартных командах Linux, поскольку мне нужно администрировать довольно много систем, и установка нового программного обеспечения - это проблема (особенно, когда из дискового пространства!)

421 голос | спросил Owen Fraser-Green 28 PM00000050000004231 2008, 17:17:42

30 ответов


434

Попробуйте ncdu , отличный анализатор использования командной строки:

ответил 13 PMpWed, 13 Apr 2011 14:36:02 +040036Wednesday 2011, 14:36:02
307

Не переходите прямо к du /. Используйте df, чтобы найти раздел, который причиняет вам боль, а затем попробуйте команды du.

Мне нравится попробовать

# U.S.
du -h <dir> | grep '[0-9\.]\+G'
# Others
du -h <dir> | grep '[0-9\,]\+G'

, потому что он печатает размеры в «удобочитаемой форме». Если у вас действительно маленькие разделы, grepping для каталогов в гигабайтах - довольно хороший фильтр для того, что вы хотите. Это займет у вас некоторое время, но если у вас нет квот, я думаю, что так оно и будет.

Как отмечает @jchavannes в комментариях, выражение может быть более точным, если вы обнаружите слишком много ложных срабатываний. Я включил предложение, которое делает его лучше, но есть все еще ложные срабатывания, поэтому есть только компромиссы (более простые выражения, худшие результаты, более сложные и длинные expr, лучшие результаты). Если у вас слишком много каталогов, отображаемых на вашем выходе, соответствующим образом настройте ваше регулярное выражение. Например,

grep '^\s*[0-9\.]\+G'

еще более точна (в списке нет каталогов менее 1 ГБ).

Если у вас do есть квоты, вы можете использовать

quota -v

, чтобы найти пользователей, которые зацикливают диск.

ответил Ben Collins 28 PM00000050000003131 2008, 17:25:31
97

du может быть ограничено по глубине:

du -d 5

Будет возвращаться только к глубине 5.

/EDIT: это считается только для отображения; инструмент все равно определит общий размер всего дерева каталогов, но это все еще намного быстрее, чем запуск полного du.

ответил Konrad Rudolph 28 PM00000050000004431 2008, 17:19:44
47

Вы также можете запустить следующую команду, используя du:

~# du -Pshx /* 2>/dev/null
  • Опция -s суммирует и отображает итоговые значения для каждого аргумента.
  • h печатает Mio, Gio и т. д.
  • x = оставаться в одной файловой системе (очень полезно).
  • P = не следует symlinks (что может привести к тому, что файлы будут считаться дважды, например).

Будьте осторожны, каталог /root не будет показан, вам нужно запустить ~# du -Pshx /root 2>/dev/null, чтобы получить это ( один раз, я много боролся, не указав, что мой каталог /root полон).

Изменить: Исправлена ​​опция -P

ответил Creasixtine 14 Mayam13 2013, 00:51:46
24

Поиск самых больших файлов в файловой системе всегда будет длиться долго. По определению вам нужно пройти всю файловую систему, ища большие файлы. Единственным решением, вероятно, является запуск задания cron для всех ваших систем, чтобы файл был готов заранее.

Еще одна вещь, опция x du является полезной для сохранения дю от следующих точек монтирования в других файловых системах. То есть:

du -x [path]

Полную команду, которую я обычно запускаю, это:

sudo du -xm / | sort -rn > usage.txt

-m означает возврат результатов в мегабайтах, а sort -rn сначала сортирует результаты по наибольшему числу. Затем вы можете открыть файл usage.txt в редакторе, а самые большие папки (начиная с /) будут сверху.

ответил rjmunro 28 PM00000050000000231 2008, 17:27:02
19

Я всегда использую du -sm * | sort -n, который дает вам отсортированный список того, сколько подкаталогов текущего рабочего каталога используется в mebibytes.

Вы также можете попробовать Konqueror, который имеет режим просмотра размера, который похож на то, что WinDirStat делает в Windows: он дает вам визуальное представление о том, какие файлы /каталоги используют большую часть вашего пространства.

Обновление: в более поздних версиях, вы также можете использовать du -sh * | sort -h, который будет отображать файлы и сортировать по ним. (числа будут суффиксными с K, M, G, ...)

Для людей, которые ищут альтернативу представлению размера файла Konqueror KDE3, можно взглянуть на файл, хотя это не так приятно.

ответил wvdschel 28 PM00000050000003931 2008, 17:33:39
17

Я использую это для лучших 25 худших нарушителей ниже текущего каталога

# -S to not include subdir size, sorted and limited to top 25
du -S . | sort -nr | head -25
ответил serg10 8 J000000Thursday10 2010, 12:58:42
14

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

найти /-размер + 10000k

Вы можете захотеть быть более избирательным в отношении каталогов, которые вы ищете, и следить за любыми удаленно смонтированными дисками, которые могут быть отключены.

ответил Andrew Whitehouse 6 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowSat, 06 Sep 2008 19:01:42 +0400 2008, 19:01:42
10

Один из вариантов - запустить команду du /sort в качестве задания cron и вывести его в файл, чтобы он уже был там, когда вам это нужно.

ответил 28 PM00000050000002731 2008, 17:20:27
9

Для командной строки я считаю, что метод du /sort является лучшим. Если вы не на сервере, вы должны взглянуть на Baobab - анализатор использования диска . Эта программа также требует некоторого времени для запуска, но вы можете легко найти вспомогательную директорию глубоко, в глубине, где все старые ISO-файлы Linux.

ответил Peter Stuifzand 28 PM000000110000001631 2008, 23:20:16
8

Я использую

du -ch --max-depth=2 .

, и я изменяю максимальную глубину в соответствии с моими потребностями. Опция «c» выводит итоговые значения для папок, а опция «h» печатает размеры в K, M или G, если это необходимо. Как говорили другие, он все еще сканирует все каталоги, но ограничивает вывод таким образом, что мне легче найти большие каталоги.

ответил 30 AM000000120000001331 2008, 00:22:13
8

Я собираюсь второй xdiskusage. Но я добавлю в примечание, что это на самом деле du frontend и может читать вывод du из файла. Таким образом, вы можете запустить du -ax /home > ~/home-du на вашем сервере, scp обратно, а затем проанализировать его графически. Или пропустите его через ssh.

ответил derobert 2 TueEurope/Moscow2008-12-02T19:20:43+03:00Europe/Moscow12bEurope/MoscowTue, 02 Dec 2008 19:20:43 +0300 2008, 19:20:43
6

Попробуйте загрузить вывод du в простой скрипт awk, который проверяет, превышает ли размер каталога какой-то порог, если он его распечатает. Вам не нужно ждать для всего дерева, которое нужно пройти, прежде чем вы начнете получать информацию (по сравнению с другими ответами).

Например, ниже отображаются все каталоги, которые потребляют более 500 МБ.

du -kx / | awk '{ if ($1 > 500000) { print $0} }'

Чтобы сделать вышеизложенное немного более многоразовым, вы можете определить функцию в своем .bashrc (или вы можете сделать это в автономный скрипт).

dubig() {
    [ -z "$1" ] && echo "usage: dubig sizethreshMB [dir]" && return
    du -kx $2 | awk '{ if ($1 > '$1'*1024) { print $0} }'
}

Итак, dubig 200 ~/ находится под домашним каталогом (без следующих символических ссылок с устройства) для каталогов, которые используют более 200 МБ.

ответил Mark Borgerding 28 PM00000050000001731 2008, 17:50:17
4

Я предпочитаю использовать следующее, чтобы получить обзор и развернуться оттуда ...

cd /folder_to_check
du -shx */

Здесь будут отображаться результаты с возможностью чтения человеком, например, GB, MB. Это также предотвратит перемещение через удаленные файловые системы. Опция -s отображает только сводку каждой найденной папки, поэтому вы можете продолжить ее, если хотите узнать больше о папке. Имейте в виду, что в этом решении будут отображаться только папки, поэтому вы хотите опустить /после звездочки, если хотите файлы тоже.

ответил cmevoli 8 FebruaryEurope/MoscowbFri, 08 Feb 2013 17:28:44 +0400000000pmFri, 08 Feb 2013 17:28:44 +040013 2013, 17:28:44
4

Не упоминается здесь, но вы также должны проверить lsof в случае удаленных /зависающих файлов. У меня был удаленный tmp-файл размером 5.9GB из-за прокрутки cronjob.

https://serverfault.com/questions/207100/how-can -i-find-phantom-storage-usage Помог мне найти владельца процесса указанного файла (cron), а затем мне удалось перейти /proc/{cron id}/fd/{file handle #} меньше файла, о котором идет речь, чтобы начать запуск, разрешите это, а затем эхо ""> файл, чтобы очистить пространство и позволить cron изящно закрыть себя.

ответил David 15 J0000006Europe/Moscow 2013, 21:59:47
3

Мне нравится старый добрый xdiskusage как графическая альтернатива du (1).

ответил asjo 28 PM00000060000001531 2008, 18:46:15
2

Для командной строки du (и ее варианты) представляется наилучшим способом. DiskHog выглядит так, что он использует информацию du /df из задания cron, поэтому Предложение Питера , вероятно, является лучшим сочетанием простых и эффективных.

( FileLight и

ответил hometoast 28 PM00000050000002631 2008, 17:24:26
2

Для анализа использования дискового пространства вы можете использовать стандартные инструменты, такие как find и sort.

Список каталогов , отсортированных по их размеру:

find / -mount -type d -exec du -s "{}" \; | sort -n

Список файлов , отсортированных по их размеру:

find / -mount -printf "%k\t%p\n" | sort -n
ответил scai 6 +03002016-10-06T11:53:54+03:00312016bEurope/MoscowThu, 06 Oct 2016 11:53:54 +0300 2016, 11:53:54
1

Сначала я проверяю размер каталогов, например:

du -sh /var/cache/*/
ответил hendry 8 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowMon, 08 Sep 2008 23:12:23 +0400 2008, 23:12:23
1

Если вы знаете, что большие файлы были добавлены за последние несколько дней (скажем, 3), вы можете использовать команду find в сочетании с «ls -ltra», чтобы обнаружить те, кто недавно добавленные файлы:

find /some/dir -type f -mtime -3 -exec ls -lart {} \;

Это даст вам только файлы («-type f»), а не каталоги; просто файлы с временем модификации за последние 3 дня («-mtime -3») и выполните «ls -lart» для каждого найденного файла («-exec ".

ответил 12 MarpmThu, 12 Mar 2009 17:48:06 +03002009-03-12T17:48:06+03:0005 2009, 17:48:06
1

Чтобы понять непропорциональное использование дискового пространства, часто бывает полезно начинать работу с корневым каталогом и пробираться через некоторые из его самых больших детей.

Мы можем сделать это с помощью

  • сохранение вывода du в файл
  • grepping через результат итеративно

То есть:

# sum up the size of all files and directories under the root filesystem
du -a -h -x / > disk_usage.txt
# display the size of root items
grep $'\t/[^/]*$' disk_usage.txt

теперь предположим, что /usr отображаются слишком большими

# display the size of /usr items
grep $'\t/usr/[^/]*$' disk_usage.txt

теперь, если /usr /local подозрительно большой

# display the size /usr/local items
grep $'\t/usr/local/[^/]*$' disk_usage.txt

и т. д.

ответил Alexandre Jasmin 17 ThuEurope/Moscow2009-12-17T07:44:21+03:00Europe/Moscow12bEurope/MoscowThu, 17 Dec 2009 07:44:21 +0300 2009, 07:44:21
1

Я использовал эту команду для поиска файлов размером более 100 Мб:

find / -size +100M -exec ls -l {} \;
ответил 23 J000000Tuesday13 2013, 17:09:58
0

У меня было успешное отслеживание худшего нарушителя (ов), подводящего вывод du в человекообразной форме до egrep и соответствия регулярному выражению.

Например:

du -h | egrep "[0-9]+G.*|[5-9][0-9][0-9]M.*"

, который должен вернуть вам все 500 мегабайт или выше.

ответил 28 PM00000060000001931 2008, 18:53:19
0

Если вы хотите скорость, вы можете включить квоты в файловых системах, которые вы хотите контролировать (вам не нужно устанавливать квоты для любого пользователя), и использовать сценарий, который использует команду quota, чтобы отображать пространство на диске, используемое каждым пользователем. Например:

quota -v $user | grep $filesystem | awk '{ print $2 }'

предоставит вам использование диска в блоках для конкретного пользователя в конкретной файловой системе. Вы должны иметь возможность проверить использование в течение нескольких секунд таким образом.

Чтобы включить квоты, вам нужно будет добавить usrquota к параметрам файловой системы в файле /etc /fstab, а затем, возможно, перезагрузитесь, чтобы кэш-код мог быть запущен в незанятой файловой системе до вызова квоты.

ответил 17 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 17 Sep 2008 18:35:41 +0400 2008, 18:35:41
0

Вот небольшое приложение, которое использует глубокую выборку для поиска опухолей на любом диске или в каталоге. Он дважды ходит по дереву каталогов, один раз для его измерения, и второй раз распечатывает пути до 20 «случайных» байтов в каталоге.

void walk(string sDir, int iPass, int64& n, int64& n1, int64 step){
    foreach(string sSubDir in sDir){
        walk(sDir + "/" + sSubDir, iPass, n, n1, step);
    }
    foreach(string sFile in sDir){
        string sPath = sDir + "/" + sFile;
        int64 len = File.Size(sPath);
        if (iPass == 2){
            while(n1 <= n+len){
               print sPath;
               n1 += step;
            }
        }
        n += len;
    }
}

void dscan(){
    int64 n = 0, n1 = 0, step = 0;
    // pass 1, measure
    walk(".", 1, n, n1);
    print n;
    // pass 2, print
    step = n/20; n1 = step/2; n = 0;
    walk(".", 2, n, n1);
    print n;
}

Результат выглядит так, как показано в каталоге Program Files:

 7,908,634,694
.\ArcSoft\PhotoStudio 2000\Samples\3.jpg
.\Common Files\Java\Update\Base Images\j2re1.4.2-b28\core1.zip
.\Common Files\Wise Installation Wizard\WISDED53B0BB67C4244AE6AD6FD3C28D1EF_7_0_2_7.MSI
.\Insightful\splus62\java\jre\lib\jaws.jar
.\Intel\Compiler\Fortran\9.1\em64t\bin\tselect.exe
.\Intel\Download\IntelFortranProCompiler91\Compiler\Itanium\Data1.cab
.\Intel\MKL\8.0.1\em64t\bin\mkl_lapack32.dll
.\Java\jre1.6.0\bin\client\classes.jsa
.\Microsoft SQL Server\90\Setup Bootstrap\sqlsval.dll
.\Microsoft Visual Studio\DF98\DOC\TAPI.CHM
.\Microsoft Visual Studio .NET 2003\CompactFrameworkSDK\v1.0.5000\Windows CE\sqlce20sql2ksp1.exe
.\Microsoft Visual Studio .NET 2003\SDK\v1.1\Tool Developers Guide\docs\Partition II Metadata.doc
.\Microsoft Visual Studio .NET 2003\Visual Studio .NET Enterprise Architect 2003 - English\Logs\VSMsiLog0A34.txt
.\Microsoft Visual Studio 8\Microsoft Visual Studio 2005 Professional Edition - ENU\Logs\VSMsiLog1A9E.txt
.\Microsoft Visual Studio 8\SmartDevices\SDK\CompactFramework\2.0\v2.0\WindowsCE\wce500\mipsiv\NETCFv2.wce5.mipsiv.cab
.\Microsoft Visual Studio 8\VC\ce\atlmfc\lib\armv4i\UafxcW.lib
.\Microsoft Visual Studio 8\VC\ce\Dll\mipsii\mfc80ud.pdb
.\Movie Maker\MUI\0409\moviemk.chm
.\TheCompany\TheProduct\docs\TheProduct User's Guide.pdf
.\VNI\CTT6.0\help\StatV1.pdf
7,908,634,694

Он сообщает мне, что каталог равен 7.9gb, из которых

  • ~ 15% отправляется в компилятор Intel Fortran
  • ~ 15% переходит на VS .NET 2003
  • ~ 20% переходит на VS 8

Достаточно просто спросить, можно ли выгрузить любую из них.

Он также описывает типы файлов, которые распределены по файловой системе, но вместе взятые представляют собой возможность экономии пространства:

  • ~ 15% грубо идет к файлам .cab и .MSI
  • ~ 10% грубо идет к протоколированию текстовых файлов

В нем также показано много других вещей, которые я мог бы обойтись без поддержки «SmartDevices» и «ce» (~ 15%).

Требуется линейное время, но это не обязательно нужно делать.

Примеры найденных вещей:

  • резервные копии DLL во многих сохраненных репозиториях кода, которые не сохраняются действительно
  • резервная копия чьего-то жесткого диска на сервере под неясным каталогом
  • объемные временные интернет-файлы
  • древний документ и файлы справки, которые давно необходимы.
ответил 9 FebruaryEurope/MoscowbMon, 09 Feb 2009 20:35:27 +0300000000pmMon, 09 Feb 2009 20:35:27 +030009 2009, 20:35:27
0

У меня была аналогичная проблема, но ответов на этой странице было недостаточно. Я нашел следующую команду наиболее полезной для листинга:

du -a / | sort -n -r | head -n 20

Что бы показало мне 20 крупнейших преступников. Однако, несмотря на то, что я запускал это, это не показало мне реальной проблемы, потому что я уже удалил файл. Уловка заключалась в том, что был все еще запущен процесс, который ссылался на удаленный файл журнала ... поэтому мне пришлось сначала убить этот процесс, а дисковое пространство появилось как свободное.

ответил VenomFangs 3 WedEurope/Moscow2014-12-03T01:59:30+03:00Europe/Moscow12bEurope/MoscowWed, 03 Dec 2014 01:59:30 +0300 2014, 01:59:30
0

Вы можете использовать DiskReport.net для создания онлайн-отчета в Интернете обо всех ваших дисков.

Со многими записями он покажет вам график истории для всех ваших папок, легко найти, что растет

ответил SteeTri 6 J0000006Europe/Moscow 2015, 00:38:50
0

Определите проблемную файловую систему, а затем используйте -xdev для перемещения по этой файловой системе.

например.

find / -xdev -size +500000 -ls
ответил steve 26 J0000006Europe/Moscow 2015, 16:53:07
0

Существует прекрасная часть межплатформенного бесплатного программного обеспечения, называемая JDiskReport , которая включает в себя графический интерфейс чтобы исследовать, что занимает все это пространство.

Пример скриншота:
 Снимок экрана JDiskReport

Конечно, вам нужно будет очистить немного места вручную, прежде чем вы сможете загрузить и установить его, или загрузить его на другой диск (например, USB-накопитель).


(Скопировано здесь с тем же автором ответ по дублирующему вопросу)

ответил WBT 6 +03002016-10-06T05:50:16+03:00312016bEurope/MoscowThu, 06 Oct 2016 05:50:16 +0300 2016, 05:50:16
0
du -sk ./* | sort -nr | \
awk 'BEGIN{ pref[1]="K"; pref[2]="M"; pref[3]="G";} \
     { total = total + $1; x = $1; y = 1; \
       while( x > 1024 ) { x = (x + 1023)/1024; y++; } \
       printf("%g%s\t%s\n",int(x*10)/10,pref[y],$2); } \
    END { y = 1; while( total > 1024 ) { total = (total + 1023)/1024; y++; } \
          printf("Total: %g%s\n",int(total*10)/10,pref[y]); }'

Довольно ...

ответил Op4 11 PMpTue, 11 Apr 2017 22:31:00 +030031Tuesday 2017, 22:31:00

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132