Как узнать, какой агент запуска или демон запускает процесс

11

После установки Autodesk Smoke у меня все время работают два процесса httpd, и я бы хотел их остановить. Когда я использую sudo killall httpd, они останавливаются и перезапускаются сразу. Монитор активности показывает, что запускается родительский процесс, но как определить, какой агент или демон запускает его, чтобы я мог его отключить?

launchctl list | grep httpd показывает эти результаты:

302 -   0x7f94ea700dd0.anonymous.httpd  
92  -   org.apache.httpd

Я смотрю, /System/Library/LaunchDaemons/org.apache.httpd.plistи это показывает следующее. Вы можете видеть, что он установлен на disabled. Другой launchdэлемент со странным именем не отображается в поиске файловой системы, поэтому я понятия не имею, что это такое.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Disabled</key>
    <true/>
    <key>Label</key>
    <string>org.apache.httpd</string>
    <key>EnvironmentVariables</key>
    <dict>
        <key>XPC_SERVICES_UNAVAILABLE</key>
        <string>1</string>
    </dict>
    <key>ProgramArguments</key>
    <array>
        <string>/usr/sbin/httpd</string>
        <string>-D</string>
        <string>FOREGROUND</string>
    </array>
    <key>OnDemand</key>
    <false/>
</dict>
</plist>
Elliott
источник
Я узнал от Autodesk, что могу остановить процесс, /usr/sbin/apachectl stopно до сих пор не знаю, как отключить его после каждой перезагрузки.
Эллиотт
(Поздний комментарий, я знаю!) Два возможных повода, чтобы остановить launchd от его повторного запуска: (i) launchctl unload(хотя я не знаю, нужно ли вам указывать путь к списку рассылки), (ii) Если он указан в ваших элементах логина используйте инструмент «Системные настройки» -> «Пользователи и группы» -> «Элементы входа» -> Удалить ошибочную запись, если она найдена.
Вивек

Ответы:

5

Вы можете получить вывод launchctl listдля pid:

$ pgrep -fl foo
40679 bash /tmp/foo
$ launchctl list|grep 40679
40679   -   com.example.foo

Тогда, например , ищет файл с именем com.example.foo.plistв ~/Library/LaunchAgents/, /Library/LaunchAgents/или /Library/LaunchDaemons/.

Редактировать: ключ Disabled может быть переопределен в /var/db/launchd.db/com.apple.launchd/overrides.plist, который изменяется при launchctl load -wзапуске от имени пользователя root, или в /var/db/launchd.db/com.apple.launchd.peruser.$UID/overrides.plist, который изменяется при launchctl load -wзапуске от имени пользователя.

Если Apache plist, который поставляется с OS X, был включен, вы можете отключить его, запустив sudo launchctl unload -w /System/Library/LaunchDaemons/org.apache.httpd.plist.

LRI
источник
Я получил PID, затем grepped launchctl, но ничего не нашел с этим номером.
Эллиотт
На самом деле попробуйте использовать sudo launchctl list. launchctl listтолько кажется, включает в себя задания, загруженные процессом запуска пользователя.
Lri
Хорошо, это имеет смысл, спасибо. Но на самом деле не решил проблему ... Я добавил больше деталей к вопросу.
Эллиотт
0

Это дает вам список всех определений работы, ссылающихся на httpd.

grep -lR httpd /System/Library/Launch*/ /Library/Launch*/ ~/Library/LaunchAgents/
LCC
источник
Хорошая идея, но не решила проблему. Результат только один, и он отключен. Я добавил больше деталей к вопросу.
Эллиотт
1
То, что он отключен, не означает, что он не был запущен. DisabledКлюч может быть переопределены overrides.plistфайлами в / ниже /var/db/launchd.db/. Также отключенное задание может по-прежнему запускаться вручную (не автоматически во время процесса загрузки / входа в систему).
LCC
Спасибо, я не знал об этом. Я попытался grep -rn apache /private/var/db/launchd.dbи нашел только один результат. Это отключено. Мне нужно выяснить, как этот сервис запускается и как действительно отключить его.
Эллиотт
0

Поведение launchctl изменилось в том смысле, что если служба принудительно включена, она не будет изменять содержимое исходного .plist, а будет иметь отдельный каталог (который не следует изменять). Проверьте man-страницу для launchctl и опцию «-w» в команде «load». Таким образом, простое изучение файла не обязательно скажет вам, отключен он или нет. Очевидно, это не отключено :)

Попробуйте "запустить unct -w org.apache.httpd.plist". Если это работает для вас, вы все равно сможете запустить его по требованию с помощью "launchctl start org.apache.httpd.plist"

Если это не сработает, попробуйте "launchctl remove org.apache.httpd.plist", который не позволит вам запустить вручную.

Крис Когдон
источник
0

На основе значения метки (например org.apache.httpd) вы можете попытаться найти .plistследующую команду:

find /System/Library/Launch* /Library/Launch* ~/Library/Launch* -name '*.plist' -print -exec /usr/libexec/PlistBuddy -c "Print Label" {} ';' | grep org.apache.httpd -A1

Чтобы узнать, с чего начался процесс, проверьте его родительские PID, например,

ps -f $(launchctl list | grep org.apache.httpd | grep -o '^[0-9]\+')

Или используйте pstreeкоманду, указав PID вручную, например

pstree 92
kenorb
источник