3 votos

Error del comando "Matar" de AppleScript

Intento ejecutar un AppleScript cada 24 horas para cerrar una aplicación en ejecución y reiniciarla. He usado el siguiente código con éxito 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 obtengo el error de que el argumento Kill: debe ser el id de proceso o de trabajo.

Cuando compruebo el valor de the_pid, regresa con la PID correcta, sin embargo, devuelve más de una 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 falla debido a que hay más de un PID presente en la variable the_pid.

¿Alguien sabe cómo evitar/arreglar esto? ¿Cómo hacer que kill acepte la variable the_pid cuando contiene más de un PID? ¿Es una cuestión de formato?

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 deba funcionar.

4voto

Potts Puntos 21

Puedes hacer lo que estás tratando de hacer usando el 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

2voto

Malik hassan Puntos 16

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

Que no puedo replicar por razones obvias (¿Qué es tu aplicación, por cierto?)

Podrías añadir 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:

Pensando en ello, puedes usar el Applescript puro para conseguir el pid de la aplicación.

Por ejemplo; si yo ejecutara tu código original mientras busco mi aplicación 1Contraseña. obtendría dos pids. Porque 1Password ejecuta un agente 1ContraseñaAgente

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

Podría hacerlo si quisiera seguir con una concha script y correr.

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

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

Pero lo que parece ser la mejor manera es correr con pura escritura de Apple;

 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 sólo busca la "1Contraseña".

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

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X