Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
$ ls -lh disk* -rw-rw-r-- 1 seriy seriy 600G нояб. 7 14:29 disk-image -rw-rw-r-- 1 seriy seriy 600G нояб. 7 14:33 disk-image2 -rw-rw-r-- 1 seriy seriy 600G нояб. 7 14:33 disk-image3 -rw-rw-r-- 1 seriy seriy 600G нояб. 7 14:33 disk-image4 $ df -h | grep /home /dev/sda5 1,8T 822G 900G 48% /home
ulimit -m $((1024 * 50))
— не помогло. Так же набирает по 500 Мбulimit -v $((1024 * 50))
после 50Мб молча падаетsavedir_dirinfo
, которые пытается инкрементально порождать на каждую директорию, начиная выделение с xmalloc
на 16 байт, а затем растягивая получившуюся систему буферов с помощью extendbuf
, которая в свою очередь выбирает размер нового буфера тупым нахождением округления сверху (в общем, практически чуть ли не первая реализация из классической книжки Кнута): while (newsize < wanted)
{
if (2 * newsize < newsize)
xalloc_die ();
newsize *= 2;
}
return newsize;
xmalloc
/ xrealloc
и если не получится это сделать, то find отнюдь не впадает в панику и не считает это критической ошибкой, а, напротив, считает, что все, памяти уже достаточно и возвращается к предыдущему объему — и вот тут-то и должен сработать механизм дампа всего накопившегося, если это возможно (разумеется, нужно отсутствие флага SavedirSort, иначе будет вызван qsort и будет делаться сортировка вывода, что в данном случае смерти подобно).-m
в современных Linux вообще смысла не имеет, см. RLIMIT_RSS, можно попробовать -d
(но тогда и смотреть надо на data segment и учесть, что там бывает только софт-лимит), ну и по идее должен работать -v
— там просто проблема в том, что он еще и стек лимитирует и при исчерпании стека будет предсказуемо SIGSEGV — возможно, вы столкнулись именно с этой ситуацией. Можно попробовать лимитировать -v
, но сделать -s
побольше. Ну или вообще не трогать ulimit, а лимитировать через cgroups.sudo cgcreate -a $USER -g memory:tst
echo 700000000 > /sys/fs/cgroup/memory/tst/memory.limit_in_bytes
sudo cgexec -g memory:tst find /mnt/ext4/test_dir/ -delete
Nov 10 22:08:39 seriy-desktop kernel: [ 1772.927181] find invoked oom-killer: gfp_mask=0xd0, order=0, oom_adj=0, oom_score_adj=0 Nov 10 22:08:39 seriy-desktop kernel: [ 1772.927186] find cpuset=/ mems_allowed=0 .......... Nov 10 22:08:39 seriy-desktop kernel: [ 1772.927269] Task in /tst killed as a result of limit of /tst Nov 10 22:08:39 seriy-desktop kernel: [ 1772.927272] memory: usage 292972kB, limit 292972kB, failcnt 55186 Nov 10 22:08:39 seriy-desktop kernel: [ 1772.927274] memory+swap: usage 292972kB, limit 9007199254740991kB, failcnt 0 ........... Nov 10 22:08:39 seriy-desktop kernel: [ 1772.949829] [ pid ] uid tgid total_vm rss cpu oom_adj oom_score_adj name Nov 10 22:08:39 seriy-desktop kernel: [ 1772.949893] [ 5616] 0 5616 77136 73379 2 0 0 find Nov 10 22:08:39 seriy-desktop kernel: [ 1772.949895] Memory cgroup out of memory: Kill process 5616 (find) score 974 or sacrifice child Nov 10 22:08:39 seriy-desktop kernel: [ 1772.949898] Killed process 5616 (find) total-vm:308544kB, anon-rss:292736kB, file-rss:780kB
echo 1 >/sys/fs/cgroup/memory/tst/oom_control
echo 1 >/sys/fs/cgroup/memory/tst/memory.oom_control
Теперь дорастает до 300Мб и засыпает на __mem_cgroup_try_charge
.find /mnt/test_dir/ -delete
import os
for l in os.walk("/mnt/test_dir/"):
print l
rm -rfd /path
"-d"
.$ rm --version
rm (GNU coreutils) 8.13
man 2 unlink
), unlink не удаляет директорииERRORS .... EISDIR pathname refers to a directory. (This is the non-POSIX value returned by Linux since 2.1.132.)
rm: invalid option -- 'd'
while ((c = getopt_long (argc, argv, "dfirvIR", long_opts, NULL)) != -1)
{
switch (c)
{
case 'd':
/* Ignore this option, for backward compatibility with
coreutils 5.92. FIXME: Some time after 2005, change this
to report an error (or perhaps behave like FreeBSD does)
instead of ignoring the option. */
break;
-d, --directory
Удалять каталоги с помощью системного вызова unlink(2) вместо rmdir(2), и не требовать, чтобы каталог был пуст перед его разлинковкой. Работает только если у вас есть соответствующие привилегии. Поскольку разлинковка (разрыв связи) каталога приводит к тому, что все файлы в удаленном каталоге теряют ссылочную целостность, то будет благоразумно после этой операции проверить файловую систему командой fsck(8).
$ man rm
RM(1) FreeBSD General Commands Manual RM(1)
NAME
rm, unlink -- remove directory entries
SYNOPSIS
rm [-f | -i] [-dIPRrvW] file ...
unlink file
DESCRIPTION
The rm utility attempts to remove the non-directory type files specified
on the command line. If the permissions of the file do not permit writ-
ing, and the standard input device is a terminal, the user is prompted
(on the standard error output) for confirmation.
The options are as follows:
-d Attempt to remove directories as well as other types of files.
rm -d
у нас все айноды освободятся?rm -rf
?lost+found
?find . -inum 0000000 -exec rm -i {} \
mkfs -t ext4 -b 2048
mkfs -t ext4 -b 1024
find /mnt/test_dir/ -type f -exec rm -v {} \+
find /var/lib/php/session -depth -mindepth 1 -maxdepth 1 -type f -ctime +ХХХ -execdir fuser -s {} 2>/dev/null \; -delete
chdir("/mnt/test_dir"); на chdir(argv[1]);
find /backup/daily.5/ -type d -printf "Cleaning: %p\n" -exec /usr/bin/cleandir {} \;
rm -r /mnt/test_dir/
Так как же удалить миллионы файлов из одной папки?