←→ Underneath: Background Apps · Tất cả hướng dẫn Mac

Vì sao ứng dụng quay lại sau khi bạn khởi động lại máy Mac

Bạn đã thoát nó. Bạn thậm chí đã buộc thoát nó trong Giám sát hoạt động. Hai giây sau, hoặc sau lần khởi động lại tiếp theo, nó lại chạy. Có thứ gì đó đang cố ý khởi động nó. Trên máy Mac, thứ đó gần như luôn là launchd.

Trả lời ngắn: ứng dụng có một tác vụ launchd. RunAtLoad khởi động tác vụ ở mỗi lần đăng nhập, và KeepAlive khởi động lại nó mỗi khi nó dừng. Thoát tiến trình không thay đổi tác vụ. Để dừng hẳn, hãy tắt tác vụ, không phải tiến trình.

launchd là gì

launchd là tiến trình đầu tiên macOS khởi động (ID tiến trình 1). Nó khởi động gần như mọi thứ khác. Nó đọc các tệp .plist nhỏ, gọi là tác vụ (job), cho biết cần chạy cái gì và khi nào. Mỗi tác vụ có một label, là tên duy nhất như com.google.keystone.agent.

Ứng dụng cài tác vụ vào ~/Library/LaunchAgents, /Library/LaunchAgents hoặc /Library/LaunchDaemons, hoặc đăng ký chúng từ bên trong gói ứng dụng của chính mình.

Các khóa khiến ứng dụng quay lại

Đây là một launch agent điển hình:

<key>Label</key>
<string>com.example.helper</string>
<key>ProgramArguments</key>
<array>
  <string>/Applications/Example.app/Contents/MacOS/Helper</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<true/>
KhóaTác dụngBạn thấy gì
RunAtLoadKhởi động tác vụ ngay khi được nạp, tức là ở mỗi lần đăng nhập (agent) hoặc khởi động máy (daemon)Nó có mặt sau mỗi lần khởi động lại
KeepAlive = trueKhởi động lại tiến trình mỗi khi nó kết thúcBuộc thoát vô ích; nó quay lại sau vài giây
KeepAlive có điều kiệnChỉ khởi động lại trong một số trường hợp, chẳng hạn sau khi crash (SuccessfulExit = false) hoặc khi mạng đang kết nốiThỉnh thoảng nó quay lại, không phải lúc nào cũng vậy
StartIntervalChạy mỗi N giâyNó xuất hiện, chạy một lúc, biến mất, rồi lặp lại
StartCalendarIntervalChạy vào giờ đã đặt, giống cronNó xuất hiện vào cùng một giờ mỗi ngày
WatchPathsChạy khi một tệp hoặc thư mục thay đổiNó xuất hiện sau khi bạn làm một việc không liên quan

launchd chờ khoảng 10 giây giữa các lần khởi động lại một tác vụ cứ liên tục kết thúc, nên một tác vụ KeepAlive cũng có thể trông như đang “chập chờn”.

Các lý do khác khiến ứng dụng quay lại

Tìm xem nguyên nhân là cái nào

  1. Tìm label của tác vụ. Chạy launchctl list | grep -i example, dùng một phần tên ứng dụng hoặc nhà phát triển. Cột thứ ba là label.
  2. Đọc thông tin tác vụ:
    launchctl print gui/$(id -u)/com.example.helper
    Tìm path (tệp plist), state, runs (số lần đã khởi động) và last exit code. Số lần chạy cao thường có nghĩa là KeepAlive.
  3. Mở tệp plist và kiểm tra RunAtLoad, KeepAlive và các khóa về khoảng thời gian.
  4. Nếu không có tác vụ nào, hãy kiểm tra Mở khi đăng nhập và cài đặt riêng của ứng dụng.

Dừng và tắt

Bạn làm gìCó quay lại không?
Thoát hoặc buộc thoát tiến trìnhCó: ngay lập tức nếu có KeepAlive, ở lần đăng nhập sau nếu có RunAtLoad
launchctl bootout gui/$(id -u)/labelKhông phải lúc này. Có, ở lần đăng nhập sau nếu có RunAtLoad
launchctl disable gui/$(id -u)/label + bootoutKhông, cho đến khi bạn chạy launchctl enable
Chuyển tệp plist ra khỏi LaunchAgents + bootoutKhông, cho đến khi bạn chuyển nó về
Tắt trong Cho phép trong nềnKhông, cho đến khi bạn bật lại

Các lệnh từng bước có trong cách tắt launch agent an toàn.

Câu hỏi thường gặp

Vì sao một tiến trình khởi động lại ngay sau khi tôi thoát nó trong Giám sát hoạt động?

Tác vụ launchd của nó có đặt KeepAlive. launchd theo dõi tiến trình và khởi động lại khi tiến trình kết thúc. Hãy dừng tác vụ bằng launchctl bootout thay vì thoát tiến trình.

RunAtLoad nghĩa là gì?

RunAtLoad là một khóa trong tệp plist của launchd. Khi giá trị là true, launchd khởi động tác vụ ngay khi nạp tệp plist; với launch agent, điều đó có nghĩa là mỗi lần bạn đăng nhập.

KeepAlive nghĩa là gì?

KeepAlive yêu cầu launchd giữ cho tác vụ luôn chạy. Nếu tiến trình kết thúc hoặc bị kill, launchd khởi động lại nó. Khóa này cũng có thể là một tập điều kiện, chẳng hạn chỉ khởi động lại sau khi bị crash.

Dừng và tắt một launch agent khác nhau thế nào?

Dừng (launchctl bootout) gỡ nạp tác vụ cho đến lần đăng nhập hoặc khởi động lại tiếp theo. Tắt (launchctl disable, hoặc chuyển tệp plist ra khỏi LaunchAgents) ngăn tác vụ được nạp lại sau khi khởi động lại.