Esegui il applescript come servizio

0

Ho il seguente applescript in bundle come .app (utilizzando Platypus) e l'avvio sull'accesso utente (12,4 MB per ciascun utente)

#!/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

Come posso renderlo un servizio, quindi esegue solo 1 istanza e all'avvio del sistema, non all'accesso dell'utente?

Qualche altro suggerimento sul mio codice?

Modifica

Ecco il mio attuale (funzionante) .plist situato in /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>

Quando lo sposto in /Library/LaunchDaemons l'app non funziona più.

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

Devo fidarmi della mia app? Se sì, come?

    
posta RASG 05.10.2013 - 03:18
fonte

3 risposte

1

Puoi usare launchd.plist o usa un programma come Lingon (che è più facile da usare per creare un launchd plist).

    
risposta data 05.10.2013 - 08:23
fonte
1

Dai un'occhiata al mio post sul blog kill-one -l'applicazione-se-altro-è-non-esecuzione-AppleScript

Questo ti darà un'idea di come scrivere lo script salvato come file di testo (.applescript) e trasformarlo in uno script di shell.

E mostrarti come creare il tuo launch agent che verrà eseguito ogni #n secondi.

Poi c'è applescript-quit-or-launch-application- post revisionato da script che mostra un modo per adattare il codice da eseguire per più app. (che fai già in qualsiasi modo)

    
risposta data 05.10.2013 - 11:13
fonte
1

Salva un plist come questo /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>

Puoi caricare il plist con launchctl load /Library/LaunchAgents/some_label.plist o disconnettendoti e rientrando. Vedi man launchd e man launchd.plist per ulteriori informazioni.

Potresti anche sostituire AppleScript con un comando di shell come questo:

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)')

    
risposta data 05.10.2013 - 14:52
fonte

Leggi altre domande sui tag