ตะขอเริ่ม / หยุดแอปพลิเคชัน OS X


3

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

ฉันไม่ได้พัฒนาแอปพลิเคชันด้วยตัวเองมันเป็นคำถามทั่วไปที่ใช้กับแอพที่ติดตั้งไว้

คำอธิบาย: แอปพลิเคชันเริ่มต้น / ออกจะเป็นวิธีการใด ควรเรียกใช้สคริปต์และแอปพลิเคชันตามลำดับ


เท่าที่ฉันรู้คุณก็ทำไม่ได้ สามารถทำได้อย่างง่ายดายด้วย Keyboard Maestro แต่ฉันไม่รู้ว่าจะทำอย่างไรโดยไม่ใช้ซอฟต์แวร์ของ บริษัท อื่น
TJ Luoma

คำถามสองข้อที่ให้ความกระจ่างเนื่องจากคุณไม่ได้พูดจริง ๆ ว่าทำไมคุณถึงต้องทำสิ่งนี้: 1) คุณสนใจที่จะให้สคริปต์ทำงานเฉพาะเมื่อคุณเปิด / ปิดแอพผ่าน Finder, Dock, launcher ฯลฯ หรือคุณต้องการ จะใช้งานได้ตลอดเวลาที่แอปพลิเคชั่นเปิดตัวหรือปิดโดยวิธีการใด ๆ และผู้ใช้ใด ๆ 2) คุณต้องการให้สคริปต์นี้ทำงานเป็นครั้งแรกจากนั้นแอปลำดับหรือเพียงเรียกใช้แบบอะซิงโครนัส (เช่นเพื่อการบันทึก)
Jay Allen

มันเป็นแอพหนึ่งแอพหรือแอพทั้งหมด?
Tony Williams

คำตอบ:


4

สมมติว่าคำตอบสำหรับคำถามชี้แจงของฉันข้างต้นคือสิ่งที่คุณต้องการ:

  1. สคริปต์เพื่อเรียกใช้ ทุกที่ทุกเวลา มีการเรียกใช้แอปพลิเคชันเฉพาะโดยไม่คำนึงว่ากระบวนการหรือผู้ใช้นั้นเป็นอย่างไรและ
  2. สคริปต์เพื่อทำงานในแบบอะซิงโครนัสและไม่มีการบล็อก (เช่นเพื่อการบันทึก)

... อาจมีบางวิธีที่จะทำ ไม่มีฉันสามารถคิดได้ว่าจะสง่างามมากหรือแบบครบวงจรและทุกอย่างต้องมีกระบวนการปีศาจที่ทำงานเป็นรากซึ่งทำหน้าที่ตรวจสอบระบบสำหรับการเปิดตัวเหตุการณ์

การตรวจสอบ 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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.