Назад | Перейти на главную страницу

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

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


Ссылки

  • файл: ///System/Library/LaunchAgents/com.apple.Finder.plist
  • Список директив списка свойств, которые я искал, я нашел (достаточно подходящим) как
    launchd.plist(5) manual страница на Техническая записка 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 нормально работает, потому что я делал это много раз, поэтому я думаю, что проблема должна быть из-за частоты цикла сбоя / перезагрузки.

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

Используйте Родительский контроль, чтобы настроить учетную запись с ограниченным доступом. Настройте его на использование Простой поиск.