Linux - препятствование тому, чтобы приложение перестало работать из-за отсутствия дискового пространства

Не уверенный, если существует обходное решение на стороне Linux, но закрепление на стороне Windows определенно работает.

Большинство сообщений на веб-упоминании 2 ключа реестра и перезагрузка. На самом деле только одно изменение реестра необходимо в Windows 7 и никакой перезагрузке. Только сервисный перезапуск.

Говорите со своим системным администратором Windows. Если можно получить его к скопировать/вставить этому в командную строку, она должна работать:

reg add HKLM\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters /v Size /t REG_DWORD /d 3 /f
sc stop  LanmanServer
sc start LanmanServer
2
05.06.2014, 17:14
3 ответа

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

Вы можете нажать Ctrl + Z , чтобы приостановить процесс переднего плана, и возобновить его с помощью команды bg или fg . Все потоки приостанавливаются, если программа не заставила себя вести себя иначе. (Программа, предназначенная для создания потомков по сети, может вести себя иначе. Однопроцессная многопоточная программа, скорее всего, будет вести себя нормально.) Если программа состоит из разных процессов, используйте команду ps , чтобы найти их всех и что-то вроде kill -STOP 1234 1238 1239 , чтобы приостановить их все (используйте kill -CONT… , чтобы возобновить их позже).

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

Не редактируйте файлы: вряд ли это сделает то, что вы хотите. Большинство редакторов работают, сохраняя новый файл и перемещая его вместо старых (это более надежно в случае сбоя при сохранении). Вы можете сэкономить место на диске, обрезав начало файла. Сначала скопируйте файл, чтобы сохранить данные в другом месте. Затем обрежьте файл до длины 0. Программа продолжит добавление в том месте, где это было раньше; если эта позиция была 12345, то как только программа добавит еще один байт, файл начнется с 12345 нулевых байтов. Большая часть этих нулевых байтов не займет места на диске: файл будет разреженным файлом .

# Suspend the program first, otherwise you'll lose output produced between cp and truncation!
for x in *.out; do
  cp "$x" /elsewhere/
  : >|"$x"  # truncate $x to size 0
done

После завершения программы вы можете добавить оставшиеся данные к файлам, сохраненным в другом месте. Утилита tail может копировать файл, опуская первые N байтов; обратите внимание, что аргумент равен единице плюс количество байтов, которые следует опустить.

for x in *.out; do
  existing_size=$(stat -c %s "/elsewhere/$x")
  tail -c +$((existing_size+1)) "$x" >>"/elsewhere/$x"
done

Если у вас есть rsync 3.0.0 или выше, вы можете использовать

rsync --append *.out /elsewhere/

Обратите внимание, что старые версии rsync перезаписывали существующую часть файлов новыми нулевыми байтами из источника! Перед этим проверьте свои версии rsync.

2
27.01.2020, 22:00

Учитывая, что номер процесса i записывает в file_i, безопасно ли это? переместить file_i во внешнее расположение? Будет ли ОС просто создавать новый экземпляр file_i и писать в него? Я предполагаю, что перемещение файла приведет к его удалению, и процесс закончится записью в «мертвый» файл?

Если программа постоянно открывает файл, записывает данные и снова закрывается, тогда да, вы можете просто переместить файл и он создаст новый. Большинство программ так не работают. Вполне вероятно, что ОС покажет, что файл был перемещен, но фактически займет дисковое пространство, пока программа не закроет дескриптор файла.

Есть ли способ "командной строки" остановить 4 из 5 созданных рабочих и дождаться, пока один из них закончит, а затем возобновить свою работу? (Я уверен, что один рабочий поток позволит избежать перегрузки диска)

Это будет зависеть от того, какие именно рабочие потоки использует программа, и вам почти наверняка понадобится root-доступ (вам, вероятно, придется использовать инструменты отладки, и точная последовательность будет сильно зависеть от того, как работает программа). Без корневого доступа и глубокого знания внутренней работы программ это, вероятно, невозможно.

Предположим, я использую CTRL + Z, чтобы заморозить основной процесс.Остановит ли это все остальные процессы, порожденные multiprocessing.Pool? Если да, могу ли я затем безопасно отредактировать файлы, чтобы удалить лишние строки?

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


Можете ли вы переместить любые другие файлы из системы? Или это виртуальная машина, на которой можно расширить виртуальные диски?

1
27.01.2020, 22:00

Без рут-доступа ваши возможности очень ограничены. Ваш лучший выбор и единственный реальный шанс на успех, IMHO, - это сжать файлы, которые уже были написаны и закрыты, и надеяться, что это освободит достаточно места для завершения вашей программы. Могут быть другие варианты, доступные от людей из SO, вы пытались спросить там?

1
27.01.2020, 22:00

Теги

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