Удаление процесса из запуска без перезапуска

У меня есть машина, на которой я не хочу запускать Finder, поэтому изначально я сделал ее неисполняемой:

sudo chmod -R a-x /System/Library/CoreServices/Finder.app

Но затем понял, что launchd все еще пытается запускать finder несколько раз в секунду, что приводит к колоссальным файлам журналов, состоящим из миллионов строк:

com.apple.launchd.peruser.502[109] (com.apple.Finder[93799]) <Error>: posix_spawn("/System/Library/CoreServices/Finder.app/Contents/MacOS/Finder", ...): Permission denied
com.apple.launchd.peruser.502[109] (com.apple.Finder[93799]) <Warning>: Exited with exit code: 1

Так я отредактировал /System/Library/LaunchAgents/com.apple.Finder.plist чтобы он больше не запускался. Проблема, которую я имею сейчас, заставляет launchd перезагружать plist и, следовательно, перестать пытаться запустить finder. Однако я не могу перезагрузить машину.

Я попытался использовать launchctl для удаления и выгрузки процесса, но это не похоже на работу:

$ sudo launchctl unload -w /System/Library/LaunchAgents/com.apple.Finder.plist 
launchctl: Error unloading: com.apple.Finder
$ sudo launchctl remove com.apple.Finder
launchctl remove error: No such process

Есть ли в любом случае, я могу остановить запуск непрерывно, пытаясь загрузить искатель без перезагрузки машины?

6 ответов

Решение

Finder - это LaunchAgent, а не LaunchDaemon, что означает, что он загружается как часть вашего сеанса входа в систему. Либо использовать launchctl unload без sudoили просто выйдите и вернитесь.

Ваш журнал показывает, что Finder запущен для пользователя 502, но вы работаете launchctl с sudoи root не запускает Finder. Попробуйте launchctl unload без sudo,

система
Mac OS X, версия: 10.6.8 (Snow Leopard)

задача
Я хотел запретить, в основном первоначальный автоматический запуск, но также и автоматический повторный запуск Finder (как "простое" исправление для расшифровки зашифрованных дисков) до того, как Finder попытается (и не сможет) загрузить (и в этом процессе отменить) это старый (Preferences'd) список предыдущих открытых мест..

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

Теперь я также вижу, что я не сохранил свой оригинал, поэтому я не могу точно увидеть, какие изменения я сделал.

Процедура
Во всяком случае, кажется, что перезапуск удаляется (как и ожидалось), установив <key>KeepAlive</key> в поиске launchctl(1) /launchd(8) список свойств для <false/>;
Но, установив <key>RunAtLoad</key> (опять же <false/>), кажется, не имеет никакого эффекта (на Finder, поскольку он, вероятно, запускается ~ жестко закодировано ”).

В дополнение к этому я могу сказать, что создание LaunchAgent - для / с любого другого обычного приложения - с <key>RunAtLoad</key> установлен в <true/> отлично работает, если у вас, как и у меня, есть приложение (share-service), которое часто выходит из строя.


Рекомендации

  • Файл:///System/Library/LaunchAgents/com.apple.Finder.plist
  • Список директив списка свойств, которые я искал, я нашел ссылками (достаточно) как
    launchd.plist(5) manСтраница в технической заметке Apple № 2083 на эту тему (2011-12-28: "Последнее обновление: 2007-11-05")

И маленькая утилита
Если я могу порекомендовать графическое приложение для этих LaunchAgents/LaunchDaemons настройка задач, которые я хотел бы продвигать (без какой-либо принадлежности, кроме развития национальности) Lingon (обратите внимание на различные версии (Snow) Leopard и Lion).


в заключение
Извините за длинный пост по этому довольно тривиальному вопросу.
Надеюсь, что это все еще верно в версии 10.7 Lion. Хотя поведение Finder могло бы быть лучше (каким-то образом, не говоря уже о том, чтобы не отбрасывать недостающие места) в соответствии с функцией "Возобновить" Льва вместе с "Автосохранением"..
Теперь у меня есть еще одна маленькая вещь для Mac (размеры файлов), которую можно комментировать в http://unix.stackexchange.com/).

Как сказал Гордон, вам нужно выполнить launchctl unload ... команда в том же самом контексте начальной загрузки пользователя. Сам по себе launchctl имеет средство для этого через bsexec, вам просто нужно предоставить ему PID любого процесса, запущенного в этом пользовательском контексте, Finder не запущен, поэтому выберите другой. Пользовательский корневой процесс loginwindow console, так что это имеет смысл:

USERNAME=yourusername;export USERNAME; sudo launchctl bsexec "$(ps auxww | grep loginwindow\ console | grep "$USERNAME" | grep -v grep | awk '{print $2}')" sudo -u "$USERNAME" launchctl unload -wF /System/Library/LaunchAgents/com.apple.Finder.plist 

замещать yourusername с именем пользователя вы влияете и вуаля.

Сообщение об ошибке, приведенное в некоторых комментариях:

Bug: launchctl.c:2325 (23930):13: (dbfd = open(g_job_overrides_db_path, O_RDONLY | O_EXLOCK | O_CREAT, S_IRUSR | S_IWUSR)) != -1

показывает, что launchctl пытается открыть файл и не удается. Это может быть связано с разрешениями, но это маловероятно, учитывая использование sudo -u, Гораздо более вероятно, что-то связано с O_EXLOCK флаг. предположительно launchd блокирует базу данных при запуске задания, возможно, для проверки, отключено ли задание, и повторяет задание так часто, что файл базы данных блокируется большую часть времени.

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

for ((i = 0; i < 100; i++))
do
    echo -n "$i "
    launchctl unload ... && break
done

Я знаю, что выгрузка работы с ssh обычно работает, потому что я делал это много раз, поэтому я думаю, что проблема должна быть из-за частоты цикла сбоя / перезагрузки.

Я понимаю, что вы пытаетесь сделать, но вы делаете это совершенно неправильно.

Используйте Родительский контроль для настройки ограниченной учетной записи. Установите его для использования Simple Finder.

Другие вопросы по тегам