Исправление для Mac — отключение CrashReporter и предотвращение его запуска · GitHub

#!/usr/bin/env ruby ​​
#
# Mac fix 4 — Disable CrashReporter
#
# CrashReporter — это демон, который отслеживает сбои и генерирует отчет (да), когда они происходят.
# Если приложение (например, Finder) застревает в бесконечном цикле сбоя, тогда иногда
# желательно просто выключить CrashReporter полностью, так как он будет постоянно генерировать процессы в
# фон, который извергает ошибки и журналы, что приводит к огромным накладным расходам к вашим системным ресурсам.
#
# ДИАГНОСТИКА:
# Эту проблему можно диагностировать, открыв Activity Наблюдайте и смотрите в верхнюю часть процессора
# столбец для процесса ReportCrash; если он там и занимает много ресурсов ЦП, запустите этот сценарий!
#
# ПРИМЕЧАНИЕ. Для этого сценария требуется root-доступ, поэтому при его выполнении может потребоваться использование sudo
#
# ЭФФЕКТЫ:
# Важно отметить, что серьезные проблемы с CrashReporter почти всегда вызваны другими
# в вашей системе, и это исправление НЕ предлагает никаких решений для устранения таких возможностей.
# Когда вы запускаете это исправление, хотя оно отключит CrashReporter, вы должны помнить о любых потенциальных
# проблемы все еще присутствуют, и, скорее всего, для их устранения потребуется полная переустановка системы.
#
# Ресурсы
# — http://подсказка s.macworld.com/article.php?story=20090902164105138
# — https://jonathansblog.co. uk/disable-reportcrash-osx-lion
# — https://discussions.apple.com/thread/ 3837385? Tstart = 0
# — https://discussions.apple.com/thread/4525486?start= 15 & tstart = 0
#
# todo: проверить функциональность «восстановления»
#
требуется ‘optparse’
требуется ‘путь’
# Интерфейс командной строки
opts = {quiet: false}
OptionParser.new do | cli |
cli. summary_width = 16
cli.summary_indent = » * 2
cli.banner =
Использование: выполнять этот сценарий каждый раз при входе в систему (один из способов сделать это — в вашем профиле оболочки)
Команды:
restore # Заставляет скрипт ВКЛЮЧАТЬ CrashReporter вместо его отключения
Флаги:
EOS
# ВАРИАНТЫ ЗДЕСЬ
cli.on (‘- quiet’, ‘-q’, ‘Отключить весь вывод скрипта.’) {opts [: quiet] = true}
end.parse!
MODE = ARGV.shift # ‘restore’ приведет к ВКЛЮЧЕНИЮ CrashReporter
# Есть три соответствующих файла plist, отвечающих за r управление CrashReporter:
# Корневой процесс нужно включить/отключить только один раз, и, конечно же, требуется root-доступ
ROOT_FILES =% w [/System/Library/LaunchDaemons/com.apple.ReportCrash.Root.plist]
# Пользовательские процессы необходимо перезапускать/отключать при каждом входе в систему (см. ссылки выше для источника)
USER_FILES =% w [
/System/Library/LaunchAgents/com.apple.ReportCrash.plist
/System/Library /LaunchAgents/com.apple.ReportCrash.Self.plist
]
# Быстрый и надежный способ чтобы определить, активен ли ReportCrash, нужно проверить список
# работающих демонов с помощью утилиты ‘launchctl’ (для и root, и пользователь)
SCAN_ DAEMON_LIST = ‘список запусков | grep ReportCrash ‘# еще одна работающая команда — `lsof | grep ReportCrash`
CRASH_REPORTER_IS_ENABLED = (system (SCAN_DAEMON_LIST) || system («sudo # {SCAN_DAEMON_LIST}»)) ? истина: ложь
ACTION = MODE.nil? ? : unload:: load # команда для перехода к launchctl
# Если в этом исправлении нет необходимости, проинформируйте пользователя и затем выйдите
if (MODE == ‘restore’ && CRASH_REPORTER_IS_ENABLED) || (РЕЖИМ. ноль? &&! CRASH_REPORTER_IS_ENABLED)
status = CRASH_REPORTER_IS_ENABLED? : enabled:: disabled
warn «ПРЕДУПРЕЖДЕНИЕ: CrashReporter уже имеет # {status}, поэтому запуск этого сценария может быть ненужно! » если не выбрано [: quiet]
exit
конец
# Это генерирует команду, которая при запуске через CLI реализует это исправление для отдельного процесса.
# Для решения действительно неконтролируемой проблемы CrashReporter есть две необходимые части; it
# не всегда достаточно, чтобы просто отключить файл конфигурации Daemon, потому что если есть
# программа, которая постоянно дает сбой, например, запускает немедленный перезапуск
# демона, делая вашу попытку недействительной. Это сложная ситуация, но в
# есть хотя бы одно рабочее решение (см. Комментарий в теле функции для подробнее).
#
# @see https://developer.apple.com/library/mac/documentation/Darwin/Reference/Manpages/man1/launchctl.1.html
# @note Завершение работы CrashReporter с помощью `killall CrashReporter` работает не во всех случаях!
#
# @param [Pathname, String] файл Файл конфигурации Plist для одного процесса CrashReporter Daemon
# @param [Symbol, String] cmd Строка команды, переданная в `launchctl`
# @param [String] prefix Необязательная строка, добавляемая перед окончательным выводом, например ‘sudo’
# @return [String] Команда, которая будет выполнена через CLI для данного файла plist демона
#
def cmd_str (file, cmd, prefix = »)
str = «launchctl # {cmd } -w # {file} «# флаг ‘-w’ гарантирует, что файл Plist будет отредактирован
# Если CrashReporter застревает в бесконечном цикле (постоянно перезапускается), существует
# одно очень специфическое средство отключения это постоянно, включая два вызова `launchctl`
# В ОДНОЙ КОМАНДЕ. Первым шагом является завершение работы демона с помощью подкоманды `stop`
# и НЕМЕДЛЕННО после нее` && Оператор `должен следовать, подключая следующее
# выражение, которое навсегда деактивирует CrashReporter с помощью подкоманды` unload`.
str.prepend «launchctl stop # {Путь (файл). basename ‘.plist’} && «if cmd ==: unload
prefix + str
end
# Выполнить команды для каждого из соответствующих файлов Plist
begin
ROOT_DAEMONS_DISABLED = ROOT_FILES.each {| f | system cmd_str (f, ACTION, ‘sudo’)}
USER_DAEMONS_DISABLED = USER_FILES.each {| f | system cmd_str (f, ACTION)}
rescue e
abort e
end
# Распечатать результаты сценарий, предупреждающий пользователя о любых сбоях
, если ROOT_DAEMONS_DISABLED && USER_DAEMONS_DISABLED
, если opts [: quiet]
не помещает ‘CrashReporter прошел успешно полностью отключен! Перезагрузите компьютер, чтобы изменения вступили в силу. ‘
plays’ Обратите внимание, что вы должны запускать этот сценарий КАЖДОГО ВХОДИТЕ, чтобы убедиться, что CrashReporter отключен! ‘
end
else
msg = ‘ОШИБКА: одна или несколько не удалось отключить следующие демоны CrashReporter: ‘+ $/+ $/+ » t»
msg
ROOT_FILES.join ($/+ » t») + $/+ ‘Обратите внимание, что этот скрипт требуется root-доступ! ‘ if ROOT_DAEMONS_DISABLED
USER_FILES.join ($/+ » t») if USER_DAEMONS_DISABLED
opts [: quiet]? abort: abort (msg)
end
Оцените статью
techsly.ru
Добавить комментарий