Ejecutar applecript como un servicio

0

Tengo el siguiente applescript agrupado como .app (usando Platypus) y comienzo en el inicio de sesión del usuario (12.4 MB para cada usuario)

#!/usr/bin/osascript

-- INICIO DAS FUNCOES EXTRAS
set app_path to path to current application
set app_name to get name of me
set myPath to path to me
tell application "Finder" to set myFolder to (container of myPath) as string
set commonScript to load script alias ((myFolder) & "FuncoesExtras.scpt")
-- FIM DAS FUNCOES EXTRAS

set WhiteList to {app_name, "App Store", "iTunes", "FecharProgramas", "Finder", "Mail"}

repeat

    tell application "System Events"
        repeat with this_app in (get processes whose background only is false and windows is {})
            set NomeDoApp to the name of this_app
            if NomeDoApp is not in WhiteList then
                try
                    tell NomeDoApp to quit
                    log_event("App " & NomeDoApp & " encerrado com sucesso", app_name) of commonScript
                on error
                    do shell script "killall " & quoted form of NomeDoApp
                    log_event("Forcando interrupcao do App " & NomeDoApp, app_name) of commonScript
                end try
            end if
        end repeat
    end tell

    tell application "System Events" to set myPID to (unix id of processes whose name is app_name)
    do shell script ("/usr/bin/renice 18 " & myPID)

    delay 60

end repeat

¿Cómo puedo convertirlo en un servicio, de modo que solo ejecute 1 instancia y cuando se inicie el sistema, no cuando el usuario inicie sesión?

¿Alguna otra sugerencia sobre mi código?

EDIT

Aquí está mi actual (en funcionamiento) .plist ubicado en /Library/LaunchAgents

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Disabled</key>
    <false/>
    <key>EnableGlobbing</key>
    <false/>
    <key>KeepAlive</key>
    <true/>
    <key>Label</key>
    <string>ram.ramon.FecharProgramas</string>
    <key>LowPriorityIO</key>
    <true/>
    <key>Program</key>
    <string>Applications/FecharProgramas.app/Contents/MacOS/FecharProgramas</string>
    <key>RunAtLoad</key>
    <true/>
</dict>
</plist>

Cuando lo muevo a /Library/LaunchDaemons , la aplicación ya no funciona.

05/10/13 10:43:24,375 FecharProgramas[90]: 3891612: (connect_and_check) Untrusted apps are not allowed to connect to or launch Window Server before login.
05/10/13 10:43:24,376 FecharProgramas[90]: kCGErrorFailure: This user is not allowed access to the window system right now.
05/10/13 10:43:24,376 FecharProgramas[90]: _RegisterApplication(), FAILED TO establish the default connection to the WindowServer, _CGSDefaultConnection() is NULL.
05/10/13 10:43:24,382 FecharProgramas[90]: kCGErrorInvalidConnection: CGSGetEventPort: Invalid connection

¿Necesito confiar en mi aplicación? Si es así, ¿cómo?

    
pregunta RASG 05.10.2013 - 03:18

3 respuestas

1

Puede usar launchd.plist o use un programa como Lingon (que es más fácil de usar para crear un launchd plist).

    
respondido por el M K 05.10.2013 - 08:23
1

Eche un vistazo a la publicación de mi blog kill-one -application-if-another-is-not-running-applescript

Esto le dará una idea de cómo escribir su script guardado como un archivo de texto (.applescript) y convertirlo en un script de shell.

Y le muestra cómo crear su propio agente de lanzamiento que se ejecutará cada #n segundos.

Luego está el applescript-quit-o-launch-application- publicación de script revisada que muestra una forma de adaptar el código para que se ejecute para varias aplicaciones. (que ya lo haces de cualquier manera)

    
respondido por el markhunte 05.10.2013 - 11:13
1

Guarda una lista como esta como /Library/LaunchAgents/some_label.plist :

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>Label</key>
  <string>some_label</string>
  <key>ProgramArguments</key>
  <array>
    <string>osascript</string>
    <string>/path/to/script.scpt</string>
  </array>
  <key>RunAtLoad</key>
  <true/> <!-- run at login -->
  <key>KeepAlive</key>
  <true/> <!-- run the program again if it terminates -->
</dict>
</plist>

Puede cargar el plist con launchctl load /Library/LaunchAgents/some_label.plist o cerrando la sesión y volviendo a iniciarla. Consulte man launchd y man launchd.plist para obtener más información.

También puede reemplazar el AppleScript con un comando de shell como este:

kill $(osascript -e 'tell application "System Events" to id of processes where frontmost is false and background only is false and windows is {} and name is not "App Store" and name is not "iTunes" and name is not "FecharProgramas" and name is not "Finder" and name is not "Mail"' | tr -d ,); renice 18 $(osascript -e 'tell application "System Events" to id of (process 1 where frontmost is true)')

    
respondido por el user495470 05.10.2013 - 14:52

Lea otras preguntas en las etiquetas