3

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

#!/bin/bash
find /some/directory/with/pictures/* -exec rm -rf {} \+

Я проверил это, чтобы работать на рабочей станции для разработки только с ~ 250 МБ изображений (30 изображений).

Поскольку на рабочих станциях этот сценарий не запущен, у них много образов, порядка нескольких сотен гигабайт. Это означает, что когда find выполняется с помощью сценария оболочки, он останавливается и говорит «Слишком много аргументов».

Я потратил много времени, пытаясь выяснить, почему (пробуя xargs, проверяя, изменилось ли + на ; повлияло ли что-нибудь ... и т.д.), Единственное, что я не пробовал, - это входить в каталог через скрипт оболочки, чтобы избежать использования find в целом. Я думаю, что "Too Many Arguments" имеет смысл - кажется, что количество аргументов ограничено, и у меня ~ 33 000 файлов на одной рабочей станции, на которой я проверяю эту концепцию.

Чтобы запутать меня еще больше, выполните find ./ -exec rm -rf {} \; внутри самого каталога через Терминал работает (медленно).

Я выполнил удаление с помощью Терминала, так что я не беспокоюсь о процессе в будущем (он не даст около 33 тыс. Снимков в день), но я хочу знать, зачем find работы в Терминале с 33 тыс. Аргументов, но не в сценарии оболочки.

1 ответ1

1

Вы столкнулись с проблемой * nix " слишком много открытых файлов "! Macos имеет ограничения на количество файлов, которые процесс может открывать одновременно. Это похоже на то, как ulimit взаимодействует с Init в большинстве систем Linux.

Эти ограничения устанавливаются отдельно для терминала и для приложений на основе файловой системы. Ограничения по умолчанию для каждого процесса наследуются от launchd на Mac (начиная с Leopard или около того), и вы можете увидеть их как скомпилированные с использованием sudo launchctl limit

Есть способы изменить это поведение, например, Как постоянно контролировать максимальное потребление системных ресурсов на Mac?, а какая команда управляет пределами открытых файлов?

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .