приложение не уходит в корзину

обновлено · автор

macOS почти никогда не отказывает без причины, и причина почти всегда одна из пяти. идите по ним по порядку — они расставлены по тому, как часто каждая оказывается той самой, — и остановитесь на совпавшей. в какой из пяти вы находитесь, скажут две команды ещё до всякого гадания, и обе ниже. последнее средство, про которое вы читали, — удалить приложение из «Терминала» от root, — лежит в самом низу страницы, и на одной из этих пяти причин оно не работает вовсе.

первая: приложение ещё работает, даже если выглядит закрытым

«объект нельзя переместить в корзину, так как он открыт» означает ровно то, что написано, а закрыть окно — это не выйти из приложения. и чаще это даже не то приложение, на которое вы смотрите, а оставленный им помощник.

  1. выйдите из него как положено, по ⌘Q, а если не выходит — завершите принудительно: ⌥⌘⎋.
  2. откройте «Мониторинг системы» и найдите имя приложения. завершите всё совпавшее, включая то, где в имени есть helper, agent или updater.
  3. загляните в «Системные настройки» → «Основные», в список объектов входа и расширений, и уберите приложение из обоих списков — объект входа перезапускается в ту же секунду, когда вы его снимаете, отчего и кажется, что приложение с вами борется.
  4. попробуйте удалить снова.

какой процесс держит его на самом деле

«Мониторинг системы» помогает, только если вы угадали имя, а вся задача часто как раз в том, что не угадываете. спросите файл: наведите lsof не на бандл, а на исполняемый файл внутри него — Contents/MacOS и имя самого приложения, — и получите команду и её номер процесса, по строке на каждого держателя.

целиться во весь бандл через +D тоже можно, но ответ будет обо всём сразу: у приложения на 850 МБ это 270 строк, по одной на каждый фреймворк и ресурс, которые оно отобразило в память, и где-то внутри нужный вам процесс. по времени то же самое, поэтому берите короткий ответ.

вторая: это системное приложение, и это не обсуждается

«Почта», «Музыка», «Заметки», «Карты», «Новости», «Акции», Safari и их соседи защищены System Integrity Protection. Finder их не удалит, «Терминал» от root их не удалит, и ответ здесь не обходной путь: диск подписан и запечатан, а сломать это — значит обменять устойчивый Mac на значок, на который вам не хотелось смотреть.

Apple говорит это прямо — «you can't use the Finder to delete apps that are required by your Mac» (страница английская): удаление программ на Mac

как отличить защищённое приложение от запертого

разница видна из одной команды. запустите ls -lOd на приложении и прочитайте колонку после группы. защищённое отвечает root wheel restricted; поставленное вами самими отвечает вашим именем, admin и прочерком там, где был бы флаг. прочерк означает, что на уровне файловой системы файл ничем не придавлен, — значит, отказ идёт из одного из четырёх остальных разделов.

Safari здесь особняком: это вообще не папка в /Applications, а симлинк с флагами restricted,hidden в /System/Cryptexes/App. а csrutil status в обычном «Терминале» подтвердит, что защита включена, — нетронутый Mac отвечает enabled.

флаг — собственный механизм Apple, и её же заметка прямо говорит, чего он стоит root (страница английская): о защите целостности системы на Mac

что вы действительно можете сделать — убрать приложение из Dock, а если оно лезет в поиск, то и из результатов Spotlight, в разделе Spotlight в «Системных настройках».

третья: приложение заперто или не ваше

  1. выделите приложение, нажмите ⌘I и снимите вверху окна свойств галочку защиты.
  2. в том же окне, внизу, разверните общий доступ и права доступа. если вашей учётной записи нет в списке с правом на чтение и запись, нажмите на замок, подтвердите личность и дайте себе это право.
  3. если приложение лежит не в /Applications — в папке другого пользователя или на внешнем диске, отформатированном под другую систему, — сначала перенесите его туда, где хозяин вы, и удаляйте уже оттуда.

галочка защиты — это флаг uchg

тот же ls -lOd из раздела выше его и показывает: у запертого объекта там, где у обычного прочерк, написано uchg. это файловый флаг BSD, а не право доступа, и на этой разнице держится весь раздел — вы можете владеть файлом, иметь на нём чтение и запись, и всё равно получить отказ. если галочка в окне свойств неактивна или объект уже закопан в корзину, снимите флаг из «Терминала»: chflags nouchg на путь.

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

это не фольклор — галочка в Finder и флаг это один и тот же переключатель, как пишет Говард Оукли: «to set the user Immutable flag, the same thing as the Finder lock» (страница английская): защита файлов флагом защиты и неизменяемости

программа удаления читает эти флаги до того, как начать, — и в этом разница между отчётом и словом «ошибка»: удаление программ

четвёртая: его поставил ваш работодатель

если приложение возвращается после перезагрузки или корзина очищается, а оно появляется снова, загляните в «Системные настройки» → «Основные», в управление устройствами. приложение, доставленное профилем управления, переустанавливается по замыслу, и местного способа это исправить нет — профиль меняет тот, кому он принадлежит.

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

пятая: оно ушло в корзину, а корзина не очищается

  • какой-то файл внутри до сих пор используется. строка с lsof из первого раздела годится и здесь — наводите её на копию в ~/.Trash, а не на /Applications.
  • очистите корзину, удерживая ⌥, — так пропускаются проверки, которые останавливаются на занятом файле. пользуйтесь этим, когда уже знаете, чем файл был занят, а не вместо того, чтобы выяснять.
  • если дело в одном объекте, нажмите на него в корзине правой кнопкой и выберите немедленное удаление.
  • если падает с ошибкой прав, приложение ставил установщик от root — смотрите третий раздел и пробуйте снова.
  • всё ещё стоит: выйдите из учётной записи и зайдите обратно. так закрываются все ваши процессы без драмы с перезагрузкой, и именно этот шаг пропускают по дороге к перезапуску машины.

корзина, которую не получается очистить, всё это время занимает диск, и немало пропавшего места находится именно там: чем заняты «Системные данные»

как hop удаляет приложение, которое не удаляется

он не обходит ни одну из пяти. их не обходит никто — инструмент, который это обещает, либо просит у вас пароль администратора, либо выключает SIP, а флаг restricted и профиль управления одинаково сильнее любой программы удаления. меняется другое: вам называют, в какой из пяти причин вы находитесь, по имени, а не словом «ошибка».

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

почему sudo rm -rf не удалит запертое приложение

любая ветка форума рано или поздно предлагает снести приложение от root из «Терминала», и три страницы, стоящие в выдаче выше этой, дают вам строку, чтобы вставить. на запертом файле это не работает, и увидеть, как оно падает, можно секунд за десять.

создайте где угодно файл, выполните на нём chflags uchg и попробуйте. rm говорит «Operation not permitted» и выходит с кодом 1; rm -rf говорит то же самое; файл после этого на месте. учётная запись, которая это делает, владеет файлом и имеет на нём чтение и запись, так что повышать уже некуда — отказ идёт от флага, а флаг снимают, а не пересиливают. сначала chflags nouchg, потом удаление — и оно проходит с первого раза.

а там, где команда всё-таки отрабатывает, вместе с ней редко проговаривают цену: ни корзины, ни подтверждения, ни пути назад, а пробел, поставленный не туда, уносит что-нибудь ещё с той же скоростью. снимите галочку защиты в окне свойств — результат тот же, но есть откуда восстановить.

frequently asked questions

почему пишет, что приложение нельзя переместить в корзину, так как оно открыто?
процесс из этого бандла всё ещё работает. часто это не само приложение, а запущенный им помощник или обновлятор — lsof, наведённый на Contents/MacOS внутри бандла, назовёт процесс и его номер, а постоянные записаны в списке объектов входа и расширений.
как понять, что приложение защищено самой macOS?
запустите на нём ls -lOd и прочитайте колонку флагов. у защищённого будет restricted и владелец root, у поставленного вами — ваше имя и прочерк. у Safari стоит restricted,hidden, потому что это симлинк в /System/Cryptexes/App.
как удалить приложение, которое возвращается?
проверьте управление устройствами на предмет профиля конфигурации, а список объектов входа и расширений — на предмет помощника, который его переустанавливает. приложение, вернувшееся после перезагрузки, кладёт туда кто-то с бо́льшими полномочиями, чем у Finder.
можно ли удалить Safari или «Почту»?
нет. они на подписанном системном томе и защищены SIP. убрать их — значит выключить эту защиту, а это стоит куда дороже, чем значок на экране.
корзина не очищается и не говорит почему. что делать?
выйдите из учётной записи и зайдите обратно, потом попробуйте снова — так отпускаются все файлы, которые держала ваша учётная запись. если мешает один объект, нажмите на него в корзине правой кнопкой и удалите немедленно.
безопасно ли здесь sudo rm -rf?
на запертом приложении оно даже не действует: флаг uchg отвечает rm отказом «Operation not permitted» при любых раскладах, а пропущенный шаг — это chflags nouchg. там же, где команда отрабатывает, она удаляет без корзины и без отмены, и опечатка в пути уносит что-нибудь ещё с той же скоростью.

the tool behind this

app uninstallerremove an app together with what it left in about thirty places.

done with удаление программ

other things people do

об авторе

Антон Шакиров, автор hop

создаёт hop

создаёт hop и все страницы этого сайта. девятнадцать инструментов под одной иконкой в menu bar, MIT и открытый код. на issue и письма отвечает сам.

download hopfree · macOS 14+ · Apple silicon and Intel