Làm thế nào để tìm ra tác nhân khởi chạy hoặc daemon nào đang bắt đầu một quá trình


11

Sau khi cài đặt Autodesk khói, tôi có hai quy trình httpd luôn chạy và tôi muốn dừng chúng. Khi tôi sử dụng sudo killall httpd, chúng dừng lại và được khởi động lại ngay. Activity Monitor cho thấy tiến trình cha là launchd, nhưng làm cách nào để xác định tác nhân hoặc daemon nào đang khởi động nó để tôi có thể vô hiệu hóa nó?

launchctl list | grep httpd cho thấy những kết quả này:

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

Tôi nhìn vào /System/Library/LaunchDaemons/org.apache.httpd.plistvà nó cho thấy như sau. Bạn có thể thấy nó được đặt thành disabled. Các launchdmục khác có tên lạ không xuất hiện trong tìm kiếm hệ thống tệp, vì vậy tôi không biết đó là gì.

<?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>

Tôi đã học được từ Autodesk rằng tôi có thể dừng quá trình với /usr/sbin/apachectl stopnhưng tôi vẫn không biết cách tắt nó sau mỗi lần khởi động lại.
Elliott

(Late bình luận, tôi biết!) Hai dẫn thể dừng launchd từ khi bắt đầu nó một lần nữa: (i) launchctl unload(mặc dù tôi không biết nếu điều này nhu cầu bạn chỉ định đường dẫn đến plist), (ii) Nếu đó là trong loginitems của bạn , sử dụng công cụ Tùy chọn hệ thống -> "Người dùng và nhóm" -> "Mục đăng nhập" -> Xóa mục vi phạm nếu tìm thấy.
Vivek

Câu trả lời:


5

Bạn có thể grep đầu ra của launchctl listpid:

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

Sau đó, ví dụ như cái nhìn cho một file có tên com.example.foo.plisttrong ~/Library/LaunchAgents/, /Library/LaunchAgents/hoặc /Library/LaunchDaemons/.

Chỉnh sửa: Khóa bị vô hiệu hóa có thể được ghi đè /var/db/launchd.db/com.apple.launchd/overrides.plist, được sửa đổi khi launchctl load -wđược chạy dưới dạng root hoặc in /var/db/launchd.db/com.apple.launchd.peruser.$UID/overrides.plist, được sửa đổi khi launchctl load -wđược chạy với tư cách là người dùng.

Nếu tính năng Apache đi kèm với OS X được bật, bạn có thể vô hiệu hóa nó bằng cách chạy sudo launchctl unload -w /System/Library/LaunchDaemons/org.apache.httpd.plist.


Tôi đã nhận được PID, sau đó đã khởi chạy launchctl nhưng không tìm thấy gì với số đó.
Elliott

Thực tế hãy thử sử dụng sudo launchctl list. launchctl listdường như chỉ bao gồm các công việc được tải bởi quá trình launchd của người dùng.
Lri

OK mà có ý nghĩa, cảm ơn bạn. Nhưng không thực sự giải quyết vấn đề ... Tôi đã thêm chi tiết cho câu hỏi.
Elliott

0

Điều này cung cấp cho bạn một danh sách tất cả các định nghĩa công việc đề cập đến httpd.

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

Ý tưởng tốt, nhưng không giải quyết được vấn đề. Chỉ có một kết quả và nó bị vô hiệu hóa. Tôi đã thêm chi tiết cho câu hỏi.
Elliott

1
Chỉ vì nó bị vô hiệu hóa không có nghĩa là nó chưa được bắt đầu. Các Disabledquan trọng có thể được ghi đè bởi các overrides.plisttập tin trong / bên dưới /var/db/launchd.db/. Ngoài ra, một công việc bị vô hiệu hóa vẫn có thể được làm thủ công (không tự động trong quá trình khởi động / đăng nhập) bắt đầu.
LCC

Cảm ơn, tôi không biết về điều đó. Tôi đã thử grep -rn apache /private/var/db/launchd.dbvà chỉ tìm thấy một kết quả. Nó bị vô hiệu hóa. Tôi cần tìm hiểu làm thế nào dịch vụ này được bắt đầu và làm thế nào để thực sự vô hiệu hóa nó.
Elliott

0

Hành vi của launchctl đã thay đổi ở chỗ nếu một dịch vụ được kích hoạt cưỡng bức, nó sẽ không sửa đổi nội dung của nguồn .plist, mà là một thư mục riêng (bạn không nên sửa đổi). Kiểm tra trang man để biết launchctl và tùy chọn "-w" trong lệnh "load". Vì vậy, chỉ cần kiểm tra tệp sẽ không cần thiết cho bạn biết nếu nó bị vô hiệu hóa hay không. Rõ ràng nó không bị vô hiệu hóa :)

Hãy thử "launchctl unload -w org.apache.httpd.plist". Nếu điều đó phù hợp với bạn, thì bạn vẫn có thể bắt đầu theo yêu cầu với "launchctl start org.apache.httpd.plist"

Nếu điều đó không hiệu quả, hãy thử "launchctl remove org.apache.httpd.plist" sẽ không cho phép bạn bắt đầu thủ công.


0

Dựa trên giá trị nhãn (ví dụ org.apache.httpd), bạn có thể thử tìm lệnh .plistbằng cách sử dụng lệnh sau:

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

Để tìm những gì đã bắt đầu quá trình, hãy kiểm tra các bộ cha mẹ của nó, vd

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

Hoặc sử dụng pstreelệnh bằng cách chỉ định thủ công PID, vd

pstree 92
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.