остановка LaunchAgent при удалении пакета

Я создаю приложение, которое предоставляет LaunchAgent (небольшое приложение пользовательского интерфейса со значком «трей», допустим, это определено в /Library/LaunchAgents/foo.plist.

При установке пакета launchctl автоматически загружает это описание LaunchAgent и запускает процессы для всех вошедших в систему пользователей. (т.е. мне не нужно загружать его с помощью загрузки launchctl, как я должен делать с LaunchDaemons).

Когда я удаляю пакет, все файлы, включая plist-файл LaunchAgent в /Library/LaunchAgents, удаляются, но процессы продолжают работать.

(у меня несколько пользователей вошли в систему, поэтому есть несколько экземпляров этого агента)

Теперь, как я должен сказать root launchd, чтобы остановить эти процессы (для неопределенного числа пользователей) при запуске от имени root? (обратите внимание, что launchctl, запущенный от имени пользователя root, даже не видит этих агентов).

(pid-файлы, killall more-or-less-unique-executable-name - это последнее средство, и я сохраняю это решение в качестве последнего средства)


person Zbigniew Zagórski    schedule 26.03.2013    source источник


Ответы (1)


Попробуй это:

LOGGEDUSERS=`who | grep console | awk '{ print $1 }'`
for CURRUSER in $LOGGEDUSERS
do
    su -l $CURRUSER -c 'launchctl unload /Library/LaunchAgents/your.plist'
done

В моем скрипте деинсталлятора после этого кода также есть killall -15 <app_name> (на всякий случай)

person cody    schedule 26.03.2013
comment
Спасибо. Для меня это считается хакерским решением, но давайте примем реальность и забудем об этом... - person Zbigniew Zagórski; 27.03.2013
comment
Кстати, grep здесь лишний... достаточно одной трубы: LOGGEDUSERS=who | awk '/console/ { print $1 }' - person Zbigniew Zagórski; 27.03.2013