Ho un AppleScript o un set di Applescripts che sto cercando di eseguire come LaunchDaemon. Non ho problemi nell'esecuzione di LaunchDaemon con il mio utente. Il problema arriva quando ho la necessità di leggere un file che è leggibile solo da root, questo è di progettazione per ragioni di sicurezza in quanto il file contiene informazioni sensibili.
Ho installato i file AppleScript precompilati necessari, i file .scpt, in:
/Library/Scripts/myApplication/
Ho inserito i miei dati in:
/Library/LaunchDaemons
Modifica Ecco il plist per il mio demone:
<?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>com.mycompany.myapp.service</string>
<key>KeepAlive</key>
<true/>
<key>RunAtLoad</key>
<true/>
<key>ProgramArguments</key>
<array>
<string>/usr/bin/osascript</string>
<string>/Library/Scripts/myApp/myApp.scpt</string>
</array>
</dict>
Ora, quando provo a caricare i plists usando launchctl e sudo
sudo launchctl load -w /Library/LaunchDaemons/com.mycompany.myapp.service.plist
Ottengo errori nel filelog.log:
Aug 26 17:54:13 computername com.apple.xpc.launchd[1] (com.mycompany.myapp.service[74757]): Service exited with abnormal code: 1
Aug 26 17:54:13 computername com.apple.xpc.launchd[1] (com.mycompany.myapp.service): Service only ran for 0 seconds. Pushing respawn out by 10 seconds.
Tuttavia, se lascio "sudo" dal comando launchctl, funziona perfettamente. Ho anche provato a eseguire gli script dal terminale come utente root, che funziona anche bene. Tuttavia, non appena provo a caricarli con launchctl e sudo tutto muore.
Per poter eseguire questo script in precedenza, dovevo concedere all'applicazione l'esecuzione dei privilegi di accessibilità dello script sulla macchina, quindi in precedenza Sublime Text 2, Terminal e Script Editor. Immagino che questo sia ciò che sta causando la mancata esecuzione dello script, ma non so quale programma abilitare sotto accessibilità, dal momento che non viene richiesto. Quindi, come faccio a far funzionare questo script nel modo in cui ne ho bisogno?