Come forzare l'uscita dell'app Applescript dal terminale?

3

Ho scritto un applecript che accende le mie luci. L'ho esportato come applicazione con il nome "LightsOn" e appare con quel nome nel monitor attività.

In determinate circostanze, questa app si blocca. Posso forzare l'uscita da Activity Monitor, ma voglio essere in grado di farlo da uno script. killall LightsOn non funziona; Mi è stato detto che no matching processes belonging to you were found .

Come si può forzare correttamente a chiudere questa app dal terminale? Oppure, come posso scoprire il nome appropriato per killall?

    
posta Wowfunhappy 11.10.2018 - 04:11
fonte

2 risposte

2

La ragione per cui killall LightsOn non funziona è perché tutto il nome del processo dell'applicazione in esecuzione AppleScript è applet . Ad esempio, il percorso dell'eseguibile è:

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

In generale e supponendo che il processo (es) non sia (sono) sospeso, si potrebbe usare killall applet , tuttavia ciò terminerà tutte le applicazioni AppleScript in esecuzione e, naturalmente, potrebbe non essere desiderabile.

Quando un processo è bloccato, dovrai utilizzare un KILL segnale , ad esempio:

killall -KILL applet

Tuttavia, pkill è la strada da percorrere per indirizzare facilmente una specifica applicazione AppleScript e poiché è appesa ... usa un segnale KILL , ad es .:

pkill -9 -f LightsOn

o

pkill -KILL -f LightsOn

Nota in questo caso, -9 è solo un altro modo per dire -KILL .

Ora con pkill e utilizzando l'opzione -f , è possibile utilizzare più della lista argomenti completi , ad esempio:

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

Quindi non c'è alcuna ambiguità su quale sia il applet processo di cui uno è il targeting. Si può usare la maggior parte della lista di argomenti completi come si ritiene necessario per indirizzare il processo corretto.

Ad esempio, pkill -9 -f LightsOn termina un'applicazione AppleScript denominata NoLightsOn , quindi usa sempre abbastanza elenco argomenti completi per terminare il processo corretto.

Per riferimento:

Dalla pagina man di pkill :

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

Dalla pagina man di 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)

Si noti che questo è solo un elenco segnale parziale e viene utilizzato con molte delle diverse utilità che possono terminare un processo. Vedi le varie pagine di manuale delle utilità utilizzate per ulteriori informazioni.

    
risposta data 11.10.2018 - 12:33
fonte
1

Prova questo:

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

Questo dovrebbe mostrarti le informazioni di processo corrispondenti.

Puoi anche provare pkill che dovrebbe funzionare in questo modo:

pgrep -fl LightsOn

Se questo ti mostra il PID, puoi passare a pkill :

pkill -9 -f LightsOn

Quando esegui pkill -9, non stai dicendo all'applicazione di terminare se stessa, ma stai dicendo al sistema operativo di interrompere l'esecuzione del programma, indipendentemente dal programma.

Quando l'app si blocca inviando kill senza specificare il segnale #, assegnerà automaticamente ad esso il segnale < 15 & gt ;, che significa chiedere all'app di terminarlo da solo, non può farlo mentre è bloccato.

    
risposta data 11.10.2018 - 04:38
fonte

Leggi altre domande sui tag