У меня есть машина, на которой я не хочу запускать Finder, поэтому изначально я сделал ее невыполнимой:
sudo chmod -R a-x /System/Library/CoreServices/Finder.app
Но потом понял, что launchd все еще пытается запускать поисковик несколько раз каждую секунду, в результате чего получаются колоссальные файлы журнала, состоящие из миллионов строк:
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 перезагрузить список и, следовательно, перестать пытаться запустить 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
Могу ли я в любом случае остановить launchd, постоянно пытаясь загрузить Finder, не перезагружая машину?
Finder - это LaunchAgent, а не LaunchDaemon, что означает, что он загружается как часть вашего сеанса входа в систему. Либо используйте launchctl unload
без sudo
, или просто выйдите и снова войдите.
Система
Mac OS X, версия: 10.6.8 (Snow Leopard)
Задача
Я хотел запретить, в основном первоначальный автоматический запуск, но также и автоматический повторный запуск Finder (как «простое» решение для расшифровки зашифрованных дисков) до того, как Finder попытается (и потерпит неудачу) загрузиться (и в этом процессе отбросить) это старый (предпочтительный) список предыдущих открытых локаций ..
Надежность
Я редко перезагружаю свой компьютер (и у меня не было особых сбоев с Finder), поэтому
Мне не приходилось видеть эффект этой конфигурации (которая больше похожа на взлом) столько раз.
Теперь я также вижу, что я не сделал резервную копию своего оригинала, поэтому я не могу точно увидеть, какие изменения я внес.
Процедура
Во всяком случае, похоже, что повторный запуск удаляется (как и ожидалось) установкой <key>KeepAlive</key>
в Finder's launchctl
(1) /launchd
(8) список собственности для <false/>
;
Но, установив <key>RunAtLoad</key>
(опять же, чтобы <false/>
) похоже, не влияет (на Finder поскольку он, вероятно, запущен ~ жестко запрограммирован »).
В качестве примечания я могу сказать, что создание LaunchAgent - для / с любым другим обычным приложением - с <key>RunAtLoad</key>
установлен в <true/>
отлично работает, если у вас, как и у меня, есть приложение (служба совместного использования), которое часто дает сбой.
Ссылки
launchd.plist
(5) man
ual страница на Техническая записка Apple №2083 по теме (28.12.2011: «Последнее обновление: 05.11.2007»)И немного утилита
Если я могу порекомендовать графическое приложение для этих LaunchAgents
/LaunchDaemons
настройка задач, которые я хотел бы продвигать (без какой-либо принадлежности, кроме гражданства развивающихся стран) Лингон (обратите внимание на разные версии (Snow) Leopard и Lion).
в заключение
Извините за длинный пост по этому довольно тривиальному вопросу.
Надеюсь, что большая часть этого по-прежнему актуальна и в версии 10.7 Lion. Хотя поведение Finder мог быть лучше (как бы то ни было, не отказываясь полностью от недостижимых мест) в соответствии с функцией «Возобновить» Льва вместе с «Автосохранением».
Теперь у меня есть еще одна маленькая вещь для Mac (размеры файлов), которую я могу прокомментировать на unix.stackexchange).
Как сказал Гордон, вам нужно выполнить свое 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
с именем пользователя, на которое вы влияете, и вуаля.
Ваш журнал показывает, что Finder запущен для пользователя 502, но вы используете launchctl
с участием sudo
, а root не запускает Finder. Попробуйте launchctl unload
без sudo
.
Сообщение об ошибке, приведенное в некоторых комментариях:
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
нормально работает, потому что я делал это много раз, поэтому я думаю, что проблема должна быть из-за частоты цикла сбоя / перезагрузки.
Я понимаю, что вы пытаетесь сделать, но вы делаете это совершенно неправильно.
Используйте Родительский контроль, чтобы настроить учетную запись с ограниченным доступом. Настройте его на использование Простой поиск.