Вопрос

У меня есть огромное количество команд оболочки, выполняемых с правами root / admin через вызов служб авторизации "AuthorizationExecuteWithPrivileges".Проблема в том, что через некоторое время (10-15 секунд, возможно, 100 команд оболочки) программа перестает отвечать с этой ошибкой в отладчике:

не смог раскошелиться:ошибка № 35

И затем, пока приложение запущено, я больше не могу запускать никаких приложений.Я исследовал эту проблему, и, по-видимому, это означает, что у системы больше нет потоков, доступных для использования.Однако я проверил с помощью Activity Monitor, и мое приложение использует только 4-5 потоков.

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

Спасибо

Это было полезно?

Решение

Как уже указывал Луис Гербарг, ваш вопрос не имеет ничего общего с потоками.Я соответствующим образом отредактировал ваш заголовок и теги.

У меня есть огромное количество команд оболочки, выполняемых с правами root / admin через вызов служб авторизации "AuthorizationExecuteWithPrivileges".

Не делай этого.Эта функция существует только для того, чтобы вы могли восстановить права root:admin ownership и бит режима setuid для инструмента, который вы хотите запустить от имени root.

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

Пример кода находится в Руководство по программированию служб авторизации.

Проблема в том, что через некоторое время (10-15 секунд, возможно, 100 команд оболочки) программа перестает отвечать с этой ошибкой в отладчике:

couldn't fork: errno 35

Да.Вы можете запускать только пару сотен процессов одновременно.Это ограничение, установленное операционной системой.

Это мягкий лимит, который означает, что вы можете поднять его — но только до жесткого лимита, который вы не можете поднять.Смотрите выходные данные limit и limit -h (в zsh;Я не знаю о других оболочках).

Вам нужно дождаться завершения процессов, прежде чем запускать другие процессы.

И затем, пока приложение запущено, я больше не могу запускать никаких приложений.

Потому что вы уже запускаете столько процессов, сколько вам разрешено.Это ограничение в сто процессов для каждого пользователя, а не для каждого процесса.

Я исследовал эту проблему, и, по-видимому, это означает, что у системы больше нет потоков, доступных для использования.

Нет, это не так.

Коды ошибок errno используются для многих целей. EAGAIN (35, “ресурс временно недоступен”) может означать, что потоков больше нет при установке системным вызовом, который запускает поток, но это не означает, что при установке другим системным вызовом или функцией.

В сообщении об ошибке, которое вы процитировали, явно говорится, что оно было установлено fork, который является системным вызовом для запуска нового процесс, не новый Нитки.В этом контексте, EAGAIN означает “вы уже запускаете столько процессов, сколько можете”.Видишь страница пользователя fork.

Однако я проверил с помощью Activity Monitor, и мое приложение использует только 4-5 потоков.

Видишь?

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

Запуск одного процесса для каждого потока только поможет вам намного быстрее исчерпать все процессы.

Я никогда раньше не использовал многопоточность …

Похоже, вы до сих пор этого не сделали, поскольку функция, на которую вы ссылаетесь, запускает процесс, а не поток.

Другие советы

Речь идет не о потоках (по крайней мере, не о потоках в вашем приложении).Речь идет о системных ресурсах.Каждый из этих разветвленных процессов потребляет по крайней мере 1 поток ядра (возможно, больше), несколько vnodes и ряд других вещей.В конечном счете система не позволит вам запускать больше процессов.

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top