←→ Underneath: Background Apps · คู่มือ Mac ทั้งหมด

วิธีปิดใช้ launch agent บน Mac อย่างปลอดภัย

การลบ .plist ออกจาก LaunchAgents เป็นคำแนะนำที่พบบ่อยที่สุด แต่ก็เป็นวิธีที่แย่ที่สุดด้วย เพราะงานจะยังทำงานต่อไปจนกว่าคุณจะเริ่มการทำงานใหม่ และคุณย้อนกลับไม่ได้ ต่อไปนี้คือวิธีที่ปลอดภัยและย้อนกลับได้

คำตอบสั้นๆ: หาป้ายกำกับของงาน แล้วเรียกใช้

launchctl bootout gui/$(id -u)/com.example.label
launchctl disable gui/$(id -u)/com.example.label

คำสั่งแรกหยุดงานทันที คำสั่งที่สองทำให้งานปิดอยู่ต่อไปหลังเริ่มการทำงานใหม่ ใช้ launchctl enable เพื่อย้อนกลับ

ก่อนเริ่ม: อย่าแตะต้องสิ่งใดใน /System/Library หรือป้ายกำกับใดๆ ที่ขึ้นต้นด้วย com.apple. สิ่งเหล่านั้นเป็นของ macOS และอย่ายุ่งกับเครื่องมือ VPN การสำรองข้อมูล ความปลอดภัย และไดรเวอร์ เว้นแต่คุณจะถอนการติดตั้งเครื่องมือนั้น

ขั้นตอนที่ 1: ค้นหางาน

Launch agent และ daemon อยู่ในสามโฟลเดอร์ที่คุณเปลี่ยนแปลงได้:

แสดงรายการสิ่งที่โหลดอยู่ตอนนี้ โดยไม่รวมงานของ Apple เอง:

launchctl list | grep -v com.apple

คอลัมน์ได้แก่ โปรเซส ID (- หากไม่ได้ทำงาน) สถานะการออกล่าสุด และป้ายกำกับ สิ่งที่คุณต้องการคือป้ายกำกับ

ขั้นตอนที่ 2: ตรวจสอบว่างานทำอะไร

plutil -p ~/Library/LaunchAgents/com.example.label.plist

หากพาธของโปรแกรมชี้ไปยังแอปที่คุณลบไปแล้ว งานนั้นคือสิ่งที่หลงเหลือและลบได้อย่างปลอดภัย หากเป็นตัวอัปเดต การปิดใช้จะทำให้แอปไม่อัปเดตเอง

ขั้นตอนที่ 3: สำรองไว้

mkdir -p ~/LaunchAgents-backup
cp ~/Library/LaunchAgents/com.example.label.plist ~/LaunchAgents-backup/

ขั้นตอนที่ 4: หยุดทันที

สำหรับเอเจนต์ (ในโฟลเดอร์ LaunchAgents โฟลเดอร์ใดก็ได้):

launchctl bootout gui/$(id -u)/com.example.label

สำหรับ daemon ใน /Library/LaunchDaemons:

sudo launchctl bootout system/com.example.label

คำสั่งนี้ยกเลิกการโหลดงานและจบโปรเซสของงาน ผลนี้ไม่คงอยู่หลังเริ่มการทำงานใหม่ หากงานมี RunAtLoad

ขั้นตอนที่ 5: ปิดไว้ถาวร

เลือกหนึ่งวิธี

ตัวเลือก A: launchctl disable (แนะนำ)

launchctl disable gui/$(id -u)/com.example.label

สำหรับ daemon: sudo launchctl disable system/com.example.label

macOS จะเก็บป้ายกำกับไว้ในรายการปิดใช้ของตัวเอง งานจึงปิดอยู่ต่อไปแม้แอปจะเขียน plist ขึ้นมาใหม่ ตรวจสอบรายการได้ด้วย:

launchctl print-disabled gui/$(id -u)

ตัวเลือก B: ย้าย plist ออกไป

mkdir -p ~/Library/LaunchAgents/Disabled
mv ~/Library/LaunchAgents/com.example.label.plist ~/Library/LaunchAgents/Disabled/

launchd อ่านเฉพาะไฟล์ที่อยู่ในโฟลเดอร์ LaunchAgents โดยตรง ไม่อ่านโฟลเดอร์ย่อย งานจึงจะไม่ถูกโหลดเมื่อเข้าสู่ระบบครั้งถัดไป ไฟล์ยังอยู่หากคุณต้องการใช้ หากแอปสร้าง plist ขึ้นมาใหม่ งานจะกลับมา ตัวเลือก A ป้องกันปัญหานี้ได้

ตัวเลือก C: การตั้งค่าระบบ

งานจำนวนมากยังปรากฏใน การตั้งค่าระบบ › ทั่วไป › รายการเข้าสู่ระบบและส่วนขยาย › อนุญาตในพื้นหลัง ด้วย การปิดสวิตช์ที่นั่นก็ได้ผลเช่นกัน แต่สวิตช์เดียวอาจครอบคลุมหลายงานจากนักพัฒนารายเดียวกัน ดู“อนุญาตในพื้นหลัง” หมายถึงอะไร

ขั้นตอนที่ 6: ตรวจสอบว่าได้ผล

launchctl list | grep com.example.label

หากไม่มีผลลัพธ์ แสดงว่างานไม่ได้โหลดอยู่ เพื่อความแน่ใจ ให้เริ่มการทำงานใหม่แล้วเรียกใช้อีกครั้ง

ย้อนกลับ

หากคุณใช้ตัวเลือก A:

launchctl enable gui/$(id -u)/com.example.label
launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/com.example.label.plist

หากคุณใช้ตัวเลือก B ให้ย้ายไฟล์กลับแล้วเรียกใช้บรรทัด bootstrap เดียวกัน สำหรับ daemon ให้ใช้ sudo และ system แทน gui/$(id -u)

คำสั่งเก่าที่คุณจะเห็นในอินเทอร์เน็ต

launchctl unload -w file.plist และ launchctl load -w file.plist ยังใช้ได้ แต่ Apple เรียกว่าเป็นคำสั่งแบบเก่า (legacy) ส่วน bootout, bootstrap, disable และ enable เป็นคำสั่งปัจจุบันและให้ข้อผิดพลาดที่ชัดเจนกว่า

คำถามที่พบบ่อย

การลบไฟล์ใน LaunchAgents ปลอดภัยหรือไม่

การปิดใช้ปลอดภัยกว่าการลบ การลบ plist ไม่ได้หยุดงานที่โหลดอยู่แล้ว และคุณจะเสียไฟล์ไปหากต้องการใช้อีก ให้ใช้ launchctl bootout และ launchctl disable หรือย้ายไฟล์ไปไว้ในโฟลเดอร์สำรอง

ควรใช้ launchctl unload -w หรือไม่

ยังใช้ได้ แต่ Apple ระบุว่า load และ unload เป็นคำสั่งแบบเก่า (legacy) บน macOS ปัจจุบันให้ใช้ launchctl bootout เพื่อหยุดงาน และ launchctl disable เพื่อปิดไว้

ฉันปิดใช้ launch agent ของ Apple ใน /System/Library ได้หรือไม่

อย่าทำ สิ่งเหล่านี้เป็นส่วนหนึ่งของ macOS ไฟล์ได้รับการปกป้องโดยการป้องกันความสมบูรณ์ของระบบ (System Integrity Protection) และการปิดใช้อาจทำให้ฟีเจอร์อย่าง iCloud, Spotlight หรือการอัปเดตใช้งานไม่ได้

จะย้อนกลับ launchctl disable ได้อย่างไร

เรียกใช้ launchctl enable gui/$(id -u)/<label> แล้วเรียกใช้ launchctl bootstrap gui/$(id -u) พร้อมพาธของ plist หรือออกจากระบบแล้วเข้าสู่ระบบใหม่

แอปนำ launch agent ของตัวเองกลับมาอีก ต้องทำอย่างไร

ใช้ launchctl disable คำสั่งนี้ปิดใช้ป้ายกำกับ งานจึงปิดอยู่ต่อไปแม้แอปจะเขียน plist ขึ้นมาใหม่ และให้ปิดการตั้งค่า “เริ่มเมื่อเข้าสู่ระบบ” ของแอปด้วย