←→ 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óa | Tác dụng | Bạn thấy gì |
|---|---|---|
RunAtLoad | Khở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 = true | Khởi động lại tiến trình mỗi khi nó kết thúc | Buộc thoát vô ích; nó quay lại sau vài giây |
KeepAlive có điều kiện | Chỉ 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ối | Thỉnh thoảng nó quay lại, không phải lúc nào cũng vậy |
StartInterval | Chạy mỗi N giây | Nó xuất hiện, chạy một lúc, biến mất, rồi lặp lại |
StartCalendarInterval | Chạy vào giờ đã đặt, giống cron | Nó xuất hiện vào cùng một giờ mỗi ngày |
WatchPaths | Chạy khi một tệp hoặc thư mục thay đổi | Nó 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
- Mở khi đăng nhập. Ứng dụng nằm trong Cài đặt hệ thống › Cài đặt chung › Mục đăng nhập & tiện ích mở rộng. macOS mở nó ở mỗi lần đăng nhập.
- Mở lại cửa sổ khi đăng nhập lại. Ô này trong hộp thoại Khởi động lại và Tắt máy khôi phục mọi ứng dụng đang mở.
- Ứng dụng tự thêm lại chính nó. Cài đặt “Khởi chạy khi đăng nhập” riêng của nó đăng ký lại mỗi lần ứng dụng chạy.
- Một tiến trình trợ giúp mở ứng dụng chính. Một tiến trình trợ giúp nhỏ chạy nền khởi động trước rồi mở ứng dụng đầy đủ, ví dụ để hiển thị trạng thái đồng bộ.
- Dịch vụ Homebrew.
brew services startghi một launch agent cóRunAtLoad. Dừng nó bằngbrew services stop <name>.
Tìm xem nguyên nhân là cái nào
- 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. - Đọc thông tin tác vụ:
Tìmlaunchctl print gui/$(id -u)/com.example.helperpath(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. - Mở tệp plist và kiểm tra
RunAtLoad,KeepAlivevà các khóa về khoảng thời gian. - 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ình | Có: ngay lập tức nếu có KeepAlive, ở lần đăng nhập sau nếu có RunAtLoad |
launchctl bootout gui/$(id -u)/label | Không phải lúc này. Có, ở lần đăng nhập sau nếu có RunAtLoad |
launchctl disable gui/$(id -u)/label + bootout | Không, cho đến khi bạn chạy launchctl enable |
| Chuyển tệp plist ra khỏi LaunchAgents + bootout | Không, cho đến khi bạn chuyển nó về |
| Tắt trong Cho phép trong nền | Khô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.