Làm thế nào để khởi động lại launchd OS X mà không cần khởi động lại?


14

Khi tôi chạy Zotero / Firefox, chúng thường gặp sự cố và tôi bị bỏ lại với các quy trình zombie; sau này tôi không thể mở các phiên bản mới của Zotero hoặc Firefox. Tôi muốn thoát khỏi các quá trình zombie này hơn là khởi động lại, vì vậy đối với <pid>quá trình zombie,

$ ps -p <pid> -o ppid=

cho tôi <parent_pid>

ps aux | awk -v PID=<parent_pid> '$2 == PID {print $0}'

cho tôi biết quá trình cha mẹ là /sbin/launchdcho người dùng crippledlambda.

Có cách nào để khởi động lại mà không làm hỏng hệ thống của tôi không?

sudo kill -1 <parent_pid>

Không lam gi cả. Tôi đã thử viết điều này trong một kịch bản và chạy nó với sudo:

for i in `launchctl list | grep launchd | awk -v PID=<parent_pid> '$1==PID { print $NF }'`; do `launchctl stop $i && launchctl start $i` ; done

và điều này rõ ràng (?) để lại cho tôi một màn hình màu xám không phản hồi nên dù sao tôi cũng phải khởi động lại. Cảm ơn những đề xuất bạn đưa ra.


Tại sao bạn lại giết launchd thay vì các quy trình còn sót lại? launchd là một phần cốt lõi của phiên người dùng; ngay cả khi bạn có thể khởi động lại nó, phiên bản mới sẽ không phải là cha mẹ của tất cả các quy trình khác mà nó chịu trách nhiệm cho ... những thứ như Finder, Dock, v.v.
Gordon Davisson

@Gordon, bạn không thể tiêu diệt các quá trình zombie để bạn phải theo đuổi cha mẹ, trừ khi tôi thiếu thứ gì đó.
hatmatrix

Chúng có phải là zombie thực sự (tức là các quá trình đã thoát, nhưng trạng thái thoát chưa được đọc)? Nếu đúng, một cái gì đó sâu sắc hơn là sai, vì launchdphải luôn đọc trạng thái thoát của trẻ em ngay lập tức. Nếu chúng không thực sự là zombie, thì bạn nên giết chúng. Trong cả hai trường hợp, giết chóc launchdsẽ gây ra nhiều vấn đề hơn nó giải quyết.
Gordon Davisson

Câu trả lời:


17

Cách thích hợp để dừng và bắt đầu khởi chạy daemon là launchctl unload .

Ví dụ:

Bạn có thể dừng dịch vụ trình nền khởi chạy bằng cách sử dụng tiểu ban dỡ tải của launchctl .

$ sudo launchctl unload /System/Library/LaunchDaemons/<daemon name>.plist

Để bắt đầu một trình nền khởi chạy bị vô hiệu hóa hoặc dừng:

$ sudo launchctl load /System/Library/LaunchDaemons/<daemon name>.plist

★ Cẩn thận với việc vô hiệu hóa trình khởi chạy một cách ngớ ngẩn - đặc biệt là các ứng dụng chính thức của Apple; nó có khả năng làm cho hệ thống của bạn không thể khởi động cho đến khi bạn khởi động ở chế độ an toàn và bật lại chúng theo cách thủ công. Bạn không giết launchctl như một quy trình thông thường bởi vì nó có khả năng giết chết hệ thống của bạn như bạn đã trải nghiệm.

> thêm thông tin về launchctl tại đây . (Trang giới thiệu của Apple)


Xin lỗi, có phải com.apple.bsd.launchdadd.plistvậy không? Tôi không thấy launchdchính xác. Và cảm ơn vì lời cảnh báo ...
hatmatrix

Để tham khảo trong tương lai, các lệnh này cũng làm việc với scrun simctl spawn <sim_id> sudo launchctl unload …. Các tập tin plist ở dưới$(xcode-select -p)/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/System/Library/LaunchDaemons/
Leo Natan

3

Từ trang man launchd:

Bạn không thể gọi launchd trực tiếp.

Do đó ngay cả khi bạn có thể dừng nó, bạn sẽ không thể khởi động nó vì vậy câu trả lời là không có cách nào.


1
Tại sao các downvote? Bài viết của tôi trả lời đúng câu hỏi. Cấp bài khác là xây dựng hơn nhưng nó thực sự không trả lời câu hỏi thực tế theo tiêu đề của bài viết!
Ostergaard

Các bài viết khác trả lời câu hỏi.
DavidPostill

2
Không, nó không nói, làm thế nào để khởi động lại daemon không tự khởi chạy.
Ostergaard

3
lol - và đó là thái độ, độ chính xác đó không còn quan trọng nữa, điều đó giải thích cho sự suy giảm chất lượng chậm trên SO. Chúc mừng năm mới!
Ostergaard

1
Quá tệ, tôi không thể downvote bình luận. Không chỉ câu trả lời này là đúng, câu trả lời khác không thực sự giải quyết được câu hỏi. Đây không phải là về trình nền được bắt đầu bằng launchd, nhưng các quá trình zombie được kế thừa bởi launchd khi một quy trình không phản hồi đã bị chấm dứt. Tôi có cùng một vấn đề và không có daemon đẫm máu nào để giết vì đó là trình duyệt kích hoạt hành vi bị lỗi trong launchd. Trả lời bằng "bất cứ điều gì" khiến máu tôi sôi sục vì cùng những người đã tìm thấy câu trả lời hữu ích không hiểu câu hỏi ngay từ đầu và điều đó còn tệ hơn bởi một mức độ lớn.
SaltwaterC
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.