Error de comando "Kill" de AppleScript

3

Estoy intentando ejecutar un AppleScript cada 24 horas para cerrar una aplicación en ejecución y reiniciarla. He utilizado con éxito el siguiente código con otras aplicaciones:

 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

Sin embargo, cuando ejecuto este script, aparece el error de que Kill: argumento debe ser proceso o id de trabajo.

Cuando verifico el valor de the_pid, regresa con el PID correcto, sin embargo, devuelve más de un PID. Por ejemplo, devuelve 5430 y 5960, uno que corresponde a la aplicación y el otro a CrashReporter. Por lo tanto, creo que el comando kill termina porque hay más de un PID presente en la variable the_pid.

¿Alguien sabe cómo solucionar este problema? ¿Cómo hacer que kill acepte la variable the_pid cuando contiene más de un PID? ¿Es una cuestión de formateo?

Sé que siempre puedo usar killall y pasar el nombre de la aplicación, pero no hay ninguna razón técnica por la que esto no funcione.

    
pregunta user16301 11.01.2012 - 05:24

2 respuestas

4

Puede hacer lo que está tratando de hacer usando el comando killall y refiriéndose directamente al nombre de la aplicación.

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
    
respondido por el Sebastian Hallum Clarke 11.01.2012 - 17:33
2

Está claro que cualquiera que sea el nombre de tu aplicación es. También está en un CrashReporter procesa información.

Que no puedo replicar por razones obvias .. (¿Cuál es tu aplicación por cierto)

Puedes agregar 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

ACTUALIZACIÓN:

Pensándolo bien, puedes usar Applescript puro para obtener el pid de la aplicación.

Por ejemplo; si ejecuté su código original mientras buscaba mi aplicación 1Password. Obtendría dos pids. Porque 1Password ejecuta un agente 1PasswordAgent

En mi script anterior, invertiría grep (-v) para excluir cualquier cosa con la palabra Agente .

Podría si quisiera quedarme con un script de shell do y ejecutarlo.

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

Observe que agrego un espacio al final del nombre de la aplicación.

Pero lo que parece la mejor manera es ejecutarse con AppleScript puro;

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

Esto me dará exactamente lo que estoy buscando. Porque solo busca el "1Password".

Debería usar un bloque try en este tipo de script. Si la aplicación no se está ejecutando, obtendrá un error.

    
respondido por el markhunte 11.02.2012 - 12:05

Lea otras preguntas en las etiquetas