Переполните/tmp, смонтированного, когда будет свободное пространство на /

Использовать sed для создания файла оболочки, который будет содержать прокомментированный команды для удаления каждого из дубликатов файлов:

fdupes -r -n -S /directory | sed -r "s/^/#rm \"/" | sed -r "s/$/\"/" >remove-duplicate-files.sh

Получающееся remove-duplicate-files.sh файл, который мы только что создали, будет иметь каждую строку прокомментированной. Не прокомментируйте файлы, которые Вы хотите удалить. Затем выполненный sh remove-duplicate-files.sh. Вуаля!

ОБНОВЛЕНИЕ

Ну, если Вы не хотите удалять файлы только в определенных каталогах, это настолько просто:

fdupes -S /directory|sed '/^$/d' |sed -r "s/^[0-9]/#&/" > duple_list

python exclude_duplicates.py -f /path/to/dupe_list --delimiter='#' --keep=/full/path/to/protected/directory1,/full/path/to/protected/directory2\ with\ spaces\ in\ path >remove-duplicate-files-keep-protected.sh

Где exclude_duplicates.py :

#/usr/bin/python
# -*- coding: utf-8 -*-
# exclude_duplicates.py
"""
THE SCRIPT DOESN'T DELETE ANYTHING, IT ONLY GENERATES TEXT OUTPUT.
Provided a list of duplicates, such as fdupes or fslint output,
generate a bash script that will have all duplicates in protected
directories commented out. If none of the protected duplicates are
found in a set of the same files, select a random unprotected
duplicate for preserving.
Each path to a file will be transformed to an `rm "path"` string which
will be printed to standard output.     
"""

from optparse import OptionParser
parser = OptionParser()
parser.add_option("-k", "--keep", dest="keep",
    help="""List of directories which you want to keep, separated by commas. \
        EXAMPLE: exclude_duplicates.py --keep /path/to/directory1,/path/to/directory\ with\ space\ in\ path2""",
    metavar="keep"
)
parser.add_option("-d", "--delimiter", dest="delimiter",
    help="Delimiter of duplicate file groups", metavar="delimiter"
)
parser.add_option("-f", "--file", dest="file",
    help="List of duplicate file groups, separated by delimiter, for example, fdupes or fslint output.", metavar="file"
)

(options, args) = parser.parse_args()
directories_to_keep = options.keep.split(',')
file = options.file
delimiter = options.delimiter

pretty_line = '\n#' + '-' * 35
print '#/bin/bash'
print '#I will protect files in these directories:\n'
for d in directories_to_keep:
    print '# ' + d
print pretty_line

protected_set = set()
group_set = set()

def clean_set(group_set, protected_set, delimiter_line):
    not_protected_set = group_set - protected_set
    while not_protected_set:
        if len(not_protected_set) == 1 and len(protected_set) == 0:
            print '#randomly selected duplicate to keep:\n#rm "%s"' % not_protected_set.pop().strip('\n')
        else:
            print 'rm "%s"' % not_protected_set.pop().strip('\n')
    for i in protected_set: print '#excluded file in protected directory:\n#rm "%s"' % i.strip('\n')
    print '\n#%s' % delimiter_line
file = open(file, 'r')
for line in file.readlines():
    if line.startswith(delimiter):
        clean_set(group_set, protected_set, line)
        group_set, protected_set = set(), set()
    else:
        group_set = group_set|{line}
        for d in directories_to_keep:
            if line.startswith(d): protected_set = protected_set|{line}
else:
    if line: clean_set(group_set, protected_set, line)

Получающееся remove-duplicate-files-keep-protected.sh файл, который мы только что создали, будет иметь все файлы из защищенных каталогов прокомментированными. Откройте этот файл в своем любимом текстовом редакторе, проверьте, что все в порядке. Затем выполните его. Вуаля (так)!

26
09.01.2013, 14:23
3 ответа

Я сталкивался с той же проблемой на одном из моего сервера Ubuntu после поиска в сети, я получил решение.

Как защита от недостаточного пространства на диске, некоторые демоны автоматически "тени" текущий/tmp/dir с диском поршня, если корневой раздел исчерпывает дисковое пространство. Печально нет никакого автоматического возвращения того процесса, после того как достаточно дискового пространства является бесплатным снова.

Решить эту проблему, umount Ваш/tmp и выполнить эту команду:

echo 'MINTMPKB=0' > /etc/default/mountoverflowtmp

Это определенно решит Вашу проблему.

12
27.01.2020, 19:40
  • 1
    И что происходит в следующий раз начальные загрузки системы без достаточного дискового пространства, после того как Вы дали этому команду не создавать tmpfs? Я думаю, что Ваш совет является опасным и неправильным для подавляющего большинства пользователей/случаев. –  user50849 05.05.2015, 11:05
  • 2
    Что это делает? echo 'MINTMPKB=0' > /etc/default/mountoverflowtmp? –  CMCDragonkai 07.05.2015, 10:35
  • 3
    @CMCDragonkai Видит мой ответ для объяснения этого. –  user50849 03.07.2015, 14:38
  • 4
    Работавший для меня после того, как диск был полон. Установите его на 0, перезагруженный и задержите его к 1 после. Таким образом, то, когда диск является целым следующим разом, когда система, покажет то же поведение. –  Marco Hegenberg 10.02.2017, 13:39
  • 5
    Как делают Вас "umount Ваш/tmp"? Выполнение sudo umount /tmp бросает ошибку /tmp: device is busy. –  Cerin 22.06.2017, 20:09

Когда системные ботинки и жесткий жест полностью, ничто не может написать / TMP. Таким образом, во время init, TMPFS создается и установлен. Таким образом, ваша система может безопасно загружаться, потому что она может написать на / tmp.

Бесплатное пространство диска и перезагрузите компьютер. (Или просто размонтировать / TMP, если вы уверены, что ничего не использует).

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

Я думаю, что ответ Nitesh B. опасен и следует избегать.

14
27.01.2020, 19:40

Это помогло мне ; то есть после того, как я освободил место, был обходной путь:

sudo mount -o bind /var/tmp /tmp
8
27.01.2020, 19:40

Теги

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