Удаление процесса из запуска без перезапуска
У меня есть машина, на которой я не хочу запускать 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.