สมมติว่าคำตอบสำหรับคำถามชี้แจงของฉันข้างต้นคือสิ่งที่คุณต้องการ:
- สคริปต์เพื่อเรียกใช้ ทุกที่ทุกเวลา มีการเรียกใช้แอปพลิเคชันเฉพาะโดยไม่คำนึงว่ากระบวนการหรือผู้ใช้นั้นเป็นอย่างไรและ
- สคริปต์เพื่อทำงานในแบบอะซิงโครนัสและไม่มีการบล็อก (เช่นเพื่อการบันทึก)
... อาจมีบางวิธีที่จะทำ ไม่มีฉันสามารถคิดได้ว่าจะสง่างามมากหรือแบบครบวงจรและทุกอย่างต้องมีกระบวนการปีศาจที่ทำงานเป็นรากซึ่งทำหน้าที่ตรวจสอบระบบสำหรับการเปิดตัวเหตุการณ์
การตรวจสอบ exec
โทรผ่าน fs_usage
วิธีหนึ่งที่เป็นไปได้คือการสร้าง daemon (LaunchDaemon) ซึ่งทำงานอย่างต่อเนื่องตรวจสอบการทำงาน fs_usage
คำสั่งสำหรับ exec
เหตุการณ์ที่เกิดขึ้น คุณสามารถดูประเภทของข้อมูลที่คุณได้รับจากการรันคำสั่งต่อไปนี้:
sudo fs_usage -f exec
นี่คือบรรทัดที่เกี่ยวข้องเมื่อฉันเปิด Safari:
17:30:14.465075 posix_spawn /Applications/Safari.app/Contents/MacOS/Safari 0.000352 launchd.51630812
นี่คือผลลัพธ์เมื่อฉันเปิดวิ่ง open /Applications/Maps.app
จากบรรทัดคำสั่ง:
17:35:51.594849 execve /usr/bin/open 0.003680 W bash.51635318
17:35:51.642212 posix_spawn /Applications/Maps.app/Contents/MacOS/Maps 0.003158 W launchd.51635324
โปรดทราบว่า "แอปพลิเคชัน" เกือบทั้งหมด (/Applications/*.app) เปิดตัวผ่านทาง posix_spawn
โดย launchd
และไฟล์ที่ใช้ในการเปิดพวกเขาคือ /Applications/FOO.app/Contents/MacOS/FOO
(ในกรณีที่ FOO
เป็นชื่อแอปพลิเคชัน) ตามหลักการแล้วคุณสามารถให้ LaunchDaemon ตรวจสอบคำสั่งนี้และเรียกสคริปต์ของคุณเมื่อใดก็ตามที่มันส่งออกเส้นทางไปยังแอปที่คุณกำลังตรวจสอบ
sudo fs_usage -w -f exec | perl -lne 'm/.*posix_spawn +(.*?) +[0-9.]+ . launchd.\d+/sm && print $1'
การตรวจสอบ launchservicesd
ผ่านทาง lsappinfo
ฉันไม่ได้มีความสุขมากกับสิ่งที่กล่าวมาข้างต้นเพราะมันเป็นเรื่องที่ค่อนข้างแฮ็คการเฝ้าดูเหตุการณ์ของระบบไฟล์แทนที่จะเป็นการเปิดตัวกิจกรรม แล้วฉันก็รู้ " launchd
"! Enter Launch Services:
นำไปสู่:
lsappinfo listen +all forever
และVoilàคุณไม่เพียง แต่เปิดตัว แต่ยังได้รับแจ้งเมื่อแอพหยุดทำงาน กุญแจที่คุณใส่ใจมีดังต่อไปนี้:
- kLSNotifyApplicationLaunch
- kLSNotifyApplicationBirth
- kLSNotifyLaunchFinished
- kLSNotifyApplicationDeath