|
#!/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 |