如何找出哪个启动代理或守护程序正在启动进程


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>

我从Autodesk得知可以停止该过程,/usr/sbin/apachectl stop但是我仍然不知道如何在每次重新启动后将其禁用。
Elliott

(我知道最新评论!)有两种可能导致停止再次启动的线索:(i)launchctl unload(尽管我不知道这是否需要您指定plist的路径),(ii)如果在您的登录项中,请使用“系统偏好设置”工具->“用户和组”->“登录项”->删除有问题的条目(如果找到)。
Vivek

Answers:


5

您可以gpid 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/

编辑:在中/var/db/launchd.db/com.apple.launchd/overrides.plist,可以禁用禁用键,launchctl load -w在以root 用户身份运行/var/db/launchd.db/com.apple.launchd.peruser.$UID/overrides.plistlaunchctl load -w可以修改,或者在以用户身份运行时可以修改的中。

如果启用了OS X随附的Apache plist,则可以通过运行禁用它sudo launchctl unload -w /System/Library/LaunchDaemons/org.apache.httpd.plist


我得到了PID,然后grepped launchctl,但没有发现该数字。
Elliott

实际尝试使用sudo launchctl listlaunchctl list似乎只包括由用户启动的进程加载的作业。
Lri

好的,这很有意义,谢谢。但是并没有真正解决问题……我在问题中添加了更多细节。
Elliott

0

这为您提供了所有涉及的工作定义的列表httpd

grep -lR httpd /System/Library/Launch*/ /Library/Launch*/ ~/Library/LaunchAgents/

好主意,但是没有解决问题。只有一个结果,并且它被禁用。我为这个问题添加了更多细节。
Elliott

1
仅仅因为禁用它并不意味着它尚未启动。该Disabled密钥可能会被改写由overrides.plist在/下面的文件/var/db/launchd.db/。另外,仍然可以手动(在引导/登录过程中不是自动)启动禁用的作业。
LCC 2013年

谢谢,我对此一无所知。我尝试过grep -rn apache /private/var/db/launchd.db,但发现只有一个结果。已禁用。我需要弄清楚如何启动此服务以及如何真正禁用它。
Elliott 2013年

0

launchctl的行为已更改,因为如果强制启用了服务,它将不会修改源.plist的内容,而是会修改一个单独的目录(您不应修改)。检查手册页中的launchctl,以及“ load”命令下的“ -w”选项。因此,仅检查文件就不必告诉您文件是否已禁用。显然它没有被禁用:)

尝试“ launchctl卸载-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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.