Errore del comando "Uccisione" di AppleScript

3

Sto tentando di eseguire un AppleScript ogni 24 ore per chiudere un'applicazione in esecuzione e riavviarla. Ho usato il seguente codice con successo con altre app:

 repeat

 delay 84600

 set app_name to "APPLICATION NAME"

 set the_pid to (do shell script "ps ax | grep " & (quoted form of app_name) & " | grep -v grep | awk '{print $1}'")

 if the_pid is not "" then do shell script ("kill -9 " & the_pid)

 delay 30

 tell application app_name to activate

 end repeat

Tuttavia, quando eseguo questo script ottengo l'errore che Kill: l'argomento deve essere processo o id di lavoro.

Quando controllo il valore di the_pid, restituisce il PID corretto, tuttavia restituisce più di un PID. Ad esempio, restituisce 5430 e 5960, uno che corrisponde all'applicazione e l'altro a CrashReporter. Quindi, credo che il comando kill non riesca a causa della presenza di più di un PID nella variabile the_pid.

Qualcuno sa come muoversi / risolvere questo problema? Come rendere kill accetta la variabile the_pid quando contiene più di un PID? È una questione di formazione?

So che posso sempre usare killall e passare il nome dell'applicazione, ma non ci sono motivi tecnici per cui questo non dovrebbe funzionare.

    
posta user16301 11.01.2012 - 05:24
fonte

2 risposte

4

Puoi fare ciò che stai cercando di fare usando il comando killall e facendo riferimento direttamente al nome dell'applicazione.

repeat
 delay 84600
 set app_name to "APPLICATION NAME"
 do shell script "killall " & app_name
 delay 30
 tell application app_name to activate
end repeat
    
risposta data 11.01.2012 - 17:33
fonte
2

È chiaro che il nome della tua app è sempre quello. Si trova anche in informazioni sui processi di CrashReporter.

Che non posso replicare per ovvi motivi .. (Qual è la tua app tra l'altro)

Potresti semplicemente aggiungere grep -v CrashReporter

 repeat

     delay 84600

     set app_name to "APPLICATION NAME"

     set the_pid to (do shell script "ps ax | grep " & (quoted form of app_name) & " | grep -v grep | grep -v CrashReporter | awk '{print $1}'")

     if the_pid is not "" then do shell script ("kill -9 " & the_pid)

     delay 30

     tell application app_name to activate

     end repeat

UPDATE:

Pensandoci bene puoi usare puro Applescript per ottenere il pid dell'applicazione.

Ad esempio; se ho eseguito il codice originale mentre cercavo la mia app 1Password. Avrei preso due pid Perché 1Password esegue un agente 1PasswordAgent

Nel mio script sopra, invertirò grep (-v) per escludere qualsiasi cosa con la parola Agente .

Potrei se volessi mantenere uno script di shell ed eseguire.

set the_pid to (do shell script "ps ax | grep  " & (quoted form of (app_name & space)) & " | grep -v grep |awk '{print $1}'")

Avviso aggiungo uno spazio alla fine del nome dell'app.

Ma quello che sembra il modo migliore è correre con puro applescript;

 tell application "System Events"
try
        get unix id of process "1Password"
            --> 8123
end try
    end tell

Questo mi darà esattamente quello che sto cercando. Perché sta cercando solo "1Password".

Dovresti usare un blocco try su questo tipo di script. Se l'app non è in esecuzione, si verificherà un errore.

    
risposta data 11.02.2012 - 12:05
fonte

Leggi altre domande sui tag