วิธีการบังคับให้ออกจากแอป Applescript จากเทอร์มินัล


3

ฉันเขียน applescript ที่เปิดไฟ ฉันส่งออกเป็นแอปพลิเคชันที่มีชื่อ "LightsOn" และปรากฏขึ้นพร้อมชื่อนั้นในการตรวจสอบกิจกรรม

LightsOn in Activity Monitor

ในบางสถานการณ์แอพนี้อาจติดขัด ฉันสามารถบังคับให้ออกจากการตรวจสอบกิจกรรม แต่ฉันต้องการที่จะสามารถทำได้จากสคริปต์ killall LightsOn ไม่ทำงาน ฉันบอกแล้ว no matching processes belonging to you were found.

จะบังคับให้ออกจากแอปนี้อย่างเหมาะสมได้อย่างไร หรือฉันจะค้นหาชื่อที่เหมาะสมสำหรับ killall ได้อย่างไร


1
pkill -9 -f LightsOn จะทำมัน!
user3439894

@ user3439894 Yay นั่นเป็นเรื่องง่าย! ฉันพยายามหาวิธีทำสิ่งนี้มานานแล้ว หากคุณตอบคำถามนี้ฉันจะยอมรับมัน!
Wowfunhappy

ตามที่ร้องขอฉันโพสต์คำตอบที่ครอบคลุมความคิดเห็นของฉันกับคุณที่ทำงานเหนือคำตอบอื่น ๆ ที่ แต่เดิมไม่ได้ แต่หลังจากได้รับการแก้ไข ฉันเพิ่มข้อมูลเพิ่มเติมเพื่ออธิบายว่าทำไม killall LightsOn ไม่ทำงาน
user3439894

แทนที่จะต้องการฆ่าทำไมไม่ใช้รหัสหมดเวลาในแอปของคุณ?
ʀ2ᴅ2

@ ʀ2ᴅ2เรื่องยาว ๆ แต่เวอร์ชั่นสั้นเป็นเพราะ (1) นี่เป็นแอพพลิเคชั่นตัวช่วยที่มองไม่เห็นดังนั้นมันจึงไม่สำคัญมากและ (2) ไม่มีวิธีที่ดีในการตั้งค่าการหมดเวลาสำหรับเชลล์สคริปต์ใน Applescript และ สิ่งที่ทำได้คือจู้จี้จุกจิกและข้อผิดพลาดได้ง่าย
Wowfunhappy

คำตอบ:


2

เหตุผล killall LightsOn ไม่ทำงานเพราะทุกอย่างทำงานอยู่ AppleScript ชื่อกระบวนการของแอปพลิเคชันคือ applet. ตัวอย่างเช่นพา ธ ที่สามารถใช้งานได้คือ:

../LightsOn.app/Contents/MacOS/applet

โดยทั่วไปและสมมติว่ากระบวนการ (es) คือ (ไม่) หยุดการใช้งานใคร ๆ ก็สามารถใช้ได้ killall applet อย่างไรก็ตามนั่นจะยุติการทำงานทั้งหมด AppleScript แอปพลิเคชันและแน่นอนว่าอาจไม่เป็นที่ต้องการ

เมื่อกระบวนการหยุดทำงานคุณจะต้องใช้ KILL สัญญาณ , เช่น.:

killall -KILL applet

อย่างไรก็ตาม pkill เป็นวิธีที่จะไปกำหนดเป้าหมายเฉพาะได้อย่างง่ายดาย AppleScript แอปพลิเคชันและเนื่องจากมันหยุดทำงาน ... ใช้ KILL สัญญาณ , เช่น.:

pkill -9 -f LightsOn

หรือ:

pkill -KILL -f LightsOn

หมายเหตุในตัวอย่างนี้ -9 เป็นอีกวิธีหนึ่งในการพูด -KILL.

ตอนนี้ด้วย pkill และการใช้ -f ตัวเลือก หนึ่งสามารถใช้มากกว่า รายการอาร์กิวเมนต์แบบเต็ม , เช่น.:

pkill -9 -f /Applications/LightsOn.app/Contents/MacOS/applet

จากนั้นไม่มีความกำกวมใด ๆ applet กระบวนการ หนึ่งคือการกำหนดเป้าหมาย หนึ่งสามารถใช้มากของ รายการอาร์กิวเมนต์แบบเต็ม ในขณะที่รู้สึกว่าจำเป็นต้องกำหนดเป้าหมายที่ถูกต้อง กระบวนการ .

ตัวอย่างเช่น, pkill -9 -f LightsOn จะยุติการ AppleScript แอปพลิเคชันชื่อ NoLightsOnดังนั้นควรใช้ให้เพียงพอ รายการอาร์กิวเมนต์แบบเต็ม เพื่อยุติกระบวนการที่ถูกต้อง


สำหรับการอ้างอิง:

จาก pkill หน้าคน:

 -f          Match against full argument lists.  The default is to match
             against process names.

จาก killall หน้าคน:

 Some of the more commonly used signals:

 1       HUP (hang up)
 2       INT (interrupt)
 3       QUIT (quit)
 6       ABRT (abort)
 9       KILL (non-catchable, non-ignorable kill)
 14      ALRM (alarm clock)
 15      TERM (software termination signal)

โปรดทราบว่านี่เป็นเพียงบางส่วน สัญญาณ ลิสต์และใช้กับยูทิลิตี้ต่าง ๆ มากมายที่สามารถยกเลิกโปรเซสได้ ดูหน้าคู่มือต่างๆของยูทิลิตี้ที่ใช้สำหรับข้อมูลเพิ่มเติม


1

ลองสิ่งนี้:

ps auxwww | fgrep -v fgrep | fgrep -i LightsOn

ที่ควรแสดงข้อมูลกระบวนการที่ตรงกัน

คุณยังสามารถลอง pkill ซึ่งควรทำงานดังนี้:

pgrep -fl LightsOn

หากนั่นแสดง PID ให้คุณคุณสามารถไปต่อได้ pkill:

pkill -9 -f LightsOn

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

เมื่อแอพหยุดการส่ง kill โดยไม่ได้ระบุสัญญาณ # มันจะกำหนดสัญญาณโดยอัตโนมัติ & lt; 15 & gt ;, ซึ่งหมายถึงการขอให้แอปยุติด้วยตนเองก็ไม่สามารถทำได้ในขณะที่ติด


คุณพูดว่าลองสิ่งนี้: ps auxwww | fgrep -v fgrep | fgrep -I LightsOnทำไม! เมื่อ pkill -9 -f LightsOn จะทำมัน!
user3439894

pkill -fl LightsOn ไม่ได้ฆ่าแอพในเครื่องของฉัน ฉันดูเหมือนจะต้องการ -9
Wowfunhappy

@ user3439894 คำสั่งแรกไม่เคยตั้งใจจะฆ่ากระบวนการเพียงเพื่อแสดงข้อมูลซึ่งอาจช่วยอธิบายว่าทำไม killall ไม่ได้ทำในสิ่งที่คาดหวัง pkill -9 เป็นเครื่องมือทื่อไม่ใช่ขั้นตอนแรก IMO
TJ Luoma
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.