วิธีการรีสตาร์ท launchd OS X โดยไม่ต้องรีบูตเครื่อง?


14

เมื่อฉันเรียกใช้ Zotero / Firefox พวกเขามักจะผิดพลาดและฉันก็เหลือกับกระบวนการซอมบี้ หลังจากนี้ฉันไม่สามารถเปิดอินสแตนซ์ใหม่ของ Zotero หรือ Firefox ฉันต้องการกำจัดกระบวนการซอมบี้เหล่านี้แทนที่จะรีบูตดังนั้นสำหรับ<pid>กระบวนการซอมบี้

$ ps -p <pid> -o ppid=

ให้ฉัน<parent_pid>และ

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

บอกฉันการปกครองเป็นสำหรับผู้ใช้/sbin/launchdcrippledlambda

มีวิธีการรีสตาร์ทโดยไม่ฆ่าระบบของฉันหรือไม่

sudo kill -1 <parent_pid>

ไม่ทำอะไรเลย ฉันพยายามเขียนสิ่งนี้ในสคริปต์และเรียกใช้ด้วย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

และนี่ชัดเจน (?) ทำให้ฉันมีหน้าจอสีเทาไม่ตอบสนองดังนั้นฉันต้องรีบูตอยู่ดี ขอบคุณล่วงหน้าสำหรับคำแนะนำของคุณ


เหตุใดคุณจึงต้องเรียกใช้ launchd แทนกระบวนการที่เหลืออยู่ด้วยตนเอง launchd เป็นส่วนหลักของเซสชันผู้ใช้ แม้ว่าคุณจะสามารถเริ่มต้นใหม่ได้อินสแตนซ์ใหม่จะไม่เป็นแม่ของกระบวนการอื่น ๆทั้งหมดที่รับผิดชอบ ... สิ่งต่าง ๆ เช่น Finder, Dock และอื่น ๆ
Gordon Davisson

@Gordon คุณไม่สามารถฆ่ากระบวนการซอมบี้ดังนั้นคุณต้องไปตามผู้ปกครองถ้าฉันไม่ได้ทำอะไร
hatmatrix

พวกเขาเป็นซอมบี้ตัวจริง(เช่นกระบวนการที่ออกไปแล้ว แต่ยังไม่ได้อ่านสถานะทางออก) หากเป็นเช่นนั้นจะมีบางสิ่งที่ลึกกว่านั้นเป็นสิ่งผิดปกติเนื่องจากlaunchdควรอ่านสถานะทางออกของเด็กทันที หากพวกเขาไม่ใช่ซอมบี้อย่างแท้จริงคุณควรจะฆ่าพวกเขา ไม่ว่าในกรณีใดการฆ่าlaunchdจะทำให้เกิดปัญหามากกว่าที่จะแก้
Gordon Davisson

คำตอบ:


17

วิธีที่เหมาะสมในการหยุดและเริ่มต้นการเปิดใช้งาน daemons คือlaunchctl unloadขน

ตัวอย่างเช่น:

คุณสามารถหยุดการบริการเปิดตัวภูตใช้ขน subcommand ของlaunchctl

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

ในการเริ่มการเปิดใช้งาน daemon การเปิดใช้งานหรือหยุด:

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

★ระวังการปิดใช้งานการเปิดตัว daemons แบบส่งเดช - โดยเฉพาะแอปเปิ้ลอย่างเป็นทางการ มันอาจทำให้ระบบของคุณไม่สามารถบูตได้จนกว่าคุณจะเริ่มในเซฟโหมดและเปิดใช้งานด้วยตนเองอีกครั้ง คุณไม่ได้ฆ่าlaunchctlเหมือนกระบวนการปกติเพราะมันอาจฆ่าได้ระบบของคุณได้อย่างที่คุณเคยเจอ

> ข้อมูลเพิ่มเติมเกี่ยวกับ launchctl ที่นี่ (หน้าคนเปิดตัว Apple)


ขออภัยcom.apple.bsd.launchdadd.plistค่ะ ฉันไม่เห็นlaunchdอย่างแน่นอน และขอขอบคุณสำหรับคำเตือน ...
hatmatrix

สำหรับการอ้างอิงในอนาคตคำสั่งเหล่านี้ยังทำงานscrun simctl spawn <sim_id> sudo launchctl unload …ได้ ไฟล์ plist อยู่ภายใต้$(xcode-select -p)/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/System/Library/LaunchDaemons/
Leo Natan

3

จากหน้า man launchd:

คุณไม่สามารถเรียกใช้ launchd โดยตรง

ดังนั้นแม้ว่าคุณจะหยุดมันได้คุณก็จะไม่สามารถเริ่มได้ดังนั้นคำตอบคือไม่มีทาง


1
ทำไมต้องลงคะแนน? โพสต์ของฉันตอบคำถามที่ถูกต้องอย่างถูกต้อง ได้รับการโพสต์อื่น ๆ ที่สร้างสรรค์มากขึ้น แต่จริง ๆ แล้วมันล้มเหลวในการตอบคำถามจริงตามชื่อของโพสต์!
ostergaard

โพสต์อื่นจะตอบคำถาม
DavidPostill

2
ไม่มันไม่ได้บอกว่าจะรีสตาร์ท daemons โดยไม่เรียกใช้ตัวเองได้
ostergaard

3
ฮ่า ๆ - และมันเป็นทัศนคตินั้นความแม่นยำนั้นไม่สำคัญอีกต่อไปซึ่งอธิบายการลดลงอย่างช้าๆของคุณภาพของ SO สวัสดีปีใหม่!
ostergaard

1
แย่มากที่ฉันไม่สามารถลงคะแนนความคิดเห็นได้ ไม่เพียงคำตอบนี้ถูกต้องคำตอบอื่น ๆ ไม่สามารถตอบคำถามได้เลย สิ่งนี้ไม่เกี่ยวกับ daemons ที่เริ่มโดย launchd แต่กระบวนการของซอมบี้ที่สืบทอดโดย launchd เมื่อกระบวนการที่ไม่ตอบสนองถูกยกเลิกโดยการบังคับใช้ ฉันมีปัญหาเดียวกันและไม่มี daemon เลือดที่จะฆ่าเนื่องจากเป็นเบราว์เซอร์ที่ก่อให้เกิดพฤติกรรมที่ผิดพลาดในการเปิดตัว การตอบกลับด้วย "อะไรก็ตาม" ทำให้เลือดของฉันเดือดเหมือนคนที่พบคำตอบที่มีประโยชน์ล้มเหลวในการทำความเข้าใจคำถามในตอนแรกและที่แย่กว่านั้นตามลำดับความสำคัญ
SaltwaterC
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.