Bagaimana cara menghentikan aplikasi Applescript dari terminal?


3

Saya menulis sebuah apel yang menyalakan lampu saya. Saya mengekspornya sebagai aplikasi dengan nama "LightsOn", dan muncul dengan nama itu di monitor aktivitas.

LightsOn di Monitor Aktivitas

Dalam keadaan tertentu, aplikasi ini macet. Saya dapat menghentikannya secara paksa dari Activity Monitor, tetapi saya ingin dapat melakukannya dari skrip. killall LightsOntidak bekerja; Saya diberitahu itu no matching processes belonging to you were found.

Bagaimana cara memaksa keluar aplikasi ini dari terminal dengan benar? Atau, bagaimana saya bisa menemukan nama yang tepat untuk killall?


1
pkill -9 -f LightsOnakan melakukannya!
user3439894

@ user3439894 Yay, itu mudah! Saya sudah mencoba mencari tahu bagaimana melakukan ini sejak lama. Jika Anda menjawabnya, saya akan menerimanya!
Wowfunhappy

Seperti yang diminta, saya memposting jawaban yang mencakup komentar saya kepada Anda yang bekerja di atas jawaban lain yang awalnya tidak, tetapi sejak itu telah diedit. Saya menambahkan informasi tambahan untuk menjelaskan mengapa killall LightsOntidak berhasil.
user3439894

Alih-alih membutuhkan kill, mengapa tidak kode timeout di aplikasi Anda?
ʀ2ᴅ2

@ ʀ2ᴅ2 Ceritanya panjang, tetapi versi pendeknya adalah karena (1) ini adalah aplikasi pembantu yang tidak terlihat, jadi tidak masalah, dan (2) tidak ada cara yang baik untuk menetapkan batas waktu untuk skrip shell dalam sebuah Applescript, dan apa yang bisa dilakukan adalah rewel dan rawan kesalahan.
Wowfunhappy

Jawaban:


2

Alasannya killall LightsOntidak berhasil adalah karena semua nama proses aplikasi yang menjalankan AppleScript adalah applet. Misalnya, jalur yang dapat dieksekusi adalah:

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

Secara umum dan dengan asumsi proses tidak tergantung, orang dapat menggunakan killall appletnamun itu akan menghentikan semua menjalankan aplikasi AppleScript , dan tentu saja yang mungkin tidak diinginkan.

Ketika suatu proses digantung, Anda harus menggunakan KILL sinyal , misalnya:

killall -KILL applet

Namun, pkilladalah cara untuk pergi dengan mudah menargetkan aplikasi AppleScript tertentu dan karena itu tergantung ... gunakan KILL sinyal , misalnya:

pkill -9 -f LightsOn

Atau:

pkill -KILL -f LightsOn

Catatan dalam contoh ini, -9hanyalah cara lain untuk mengatakan -KILL.

Sekarang dengan pkilldan menggunakan -f opsi , seseorang dapat menggunakan lebih banyak dari daftar argumen lengkap , misalnya:

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

Maka tidak ada ambiguitas untuk applet proses mana yang ditargetkan. Orang dapat menggunakan daftar argumen lengkap sebanyak yang diperlukan untuk menargetkan proses yang benar .

Misalnya, pkill -9 -f LightsOnakan menghentikan aplikasi AppleScript bernama NoLightsOn, jadi selalu gunakan cukup daftar argumen lengkap untuk mengakhiri proses yang benar.


Sebagai referensi:

Dari pkillhalaman manual:

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

Dari killallhalaman manual:

 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)

Perhatikan bahwa ini hanyalah daftar sinyal parsial dan digunakan dengan banyak utilitas berbeda yang dapat menghentikan proses. Lihat berbagai halaman manual dari utilitas yang digunakan untuk informasi tambahan.


1

Coba ini:

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

Itu akan menunjukkan kepada Anda informasi proses yang cocok.

Anda juga dapat mencoba pkillyang seharusnya berfungsi seperti ini:

pgrep -fl LightsOn

Jika itu menunjukkan Anda PID, maka Anda dapat beralih ke pkill:

pkill -9 -f LightsOn

Ketika Anda menjalankan pkill -9, Anda tidak memberi tahu aplikasi untuk menghentikannya sendiri, sebaliknya Anda memberi tahu OS untuk berhenti menjalankan program, apa pun programnya.

Ketika aplikasi macet mengirimkan killsinyal # sinyal, itu akan secara otomatis memberikan sinyal <15>, yang berarti meminta aplikasi untuk menghentikannya sendiri, itu tidak dapat melakukannya saat macet.


Anda berkata, Coba ini ps auxwww | fgrep -v fgrep | fgrep -I LightsOn:, mengapa !? kapan pkill -9 -f LightsOnakan melakukannya!
user3439894

pkill -fl LightsOntidak mematikan aplikasi di mesin saya. Saya tampaknya membutuhkan -9.
Wowfunhappy

@ user3439894 Perintah pertama tidak pernah dimaksudkan untuk mematikan proses, hanya untuk menunjukkan informasinya, yang mungkin membantu menjelaskan mengapa killalltidak melakukan apa yang diharapkan. pkill -9adalah instrumen yang tumpul, bukan langkah pertama. IMO.
TJ Luoma
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.