2016-03-09 1 views
0

Pour une raison quelconque, Dropbox se termine (se bloque ou se ferme) après avoir été en ligne quelques jours, sans explication.LaunchAgent plist ne trouve pas le chemin vers AppleScript dans iCloud

J'ai donc commencé à chercher un moyen pour AppleScript de redémarrer automatiquement l'application quand elle se termine.

Cela m'a conduit à ce script:

repeat 
    delay 120 #Run every two minutes 
    tell application "System Events" 
     if name of every process does not contain "Dropbox" then tell application "Dropbox" to launch 
    end tell 
    delay 5 
end repeat 

Je veux aussi le script à exécuter en arrière-plan, donc je mis en œuvre ma propre variante de cette Ask Different solution pour launchctl.

Dans ~/Library/LaunchAgents/, je crée un fichier nommé dropbox-keep-alive.plist avec ce contenu:

<?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>dropbox-keep-alive.job</string> 
    <key>ProgramArguments</key> 
    <array> 
     <string>/usr/bin/osascript</string> 
     <string>/Users/xxx/Library/Mobile\ Documents/com\~apple\~ScriptEditor2/Documents/dropbox-keep-alive.scpt</string> 
    </array> 
    <key>RunAtLoad</key> 
    <true/> 
</dict> 
</plist> 

Le chemin vers l'AppleScript est donnée dans le <array> ci-dessus, et une étiquette .job pour launchutil est attribué dans le <key>.

je puis charger le .plist:

launchctl load -w ~/Library/LaunchAgents/dropbox-keep-alive.plist 

Et puis il commence:

launchctl start dropbox-keep-alive.job 

Pour les tests, je quit Dropbox puis attendre 2 + minutes, mais rien ne se passe.

Si j'essaie à nouveau launchctl load -w, le message m'indique qu'il est déjà chargé. launchctl start ne donne aucun message de réponse.

Je sais que l'AppleScript fonctionne car il est fonctionnel lorsqu'il est exécuté directement avec osascript. Mais quelque part dans le .plist - ou ma gestion de launchctl - il y a quelque chose qui ne fonctionne pas.

J'ai essayé de launchctl unload -w le script et de refaire le processus. Des idées?

+1

En fait, vous n'avez pas besoin d'un script. 'launchctl.plist' a une clé' KeepAlive' – vadian

+0

@vadian Merci pour votre suggestion!Donc, je n'aurais besoin d'inclure « KeepAlive» et une sorte d'identifiant pour l'application Dropbox (pas sûr comment)? N'hésitez pas à laisser une réponse si vous connaissez la solution. – Winterflags

+0

Vous devez spécifier le chemin d'accès complet à l'exécutable Dropbox (pas à l'ensemble d'applications) dans le tableau 'ProgramArguments'. – vadian

Répondre

2

launchd ne fait pas l'analyse syntaxique de style shell sur les chaînes, de sorte que les évasions que vous avez dans le chemin du script sera interprété dans le cadre de la réelle nom de fichier ... et il ne sera pas trouvé. Il devrait ressembler à ceci:

<key>ProgramArguments</key> 
<array> 
    <string>/usr/bin/osascript</string> 
    <string>/Users/xxx/Library/Mobile Documents/com~apple~ScriptEditor2/Documents/dropbox-keep-alive.scpt</string> 
</array> 

Je ne suis pas sûr que ce soit le problème que , mais il est certainement un problème. Si le débogage est plus nécessaire, essayez de capturer la sortie d'erreur de osascript en ajoutant quelque chose comme:

<key>StandardErrorPath</key> 
<string>/Users/xxx/Library/Logs/dropbox-keep-alive.err</string> 
1

Le fichier de script que vous demandez à launchd d'exécuter se trouve dans le dossier /Library de votre utilisateur.

Launchd n'a pas accès à cet emplacement. Déplacer vers un dossier tel que /usr/local/sbin

+0

Ceci est incorrect. launchd a un accès normal au dossier Bibliothèque de l'utilisateur. –

+0

Je n'espère pas sérieusement, les autorisations pour ce dossier sont définies comme * drwx ------ @ * et il n'y a pas de liste de contrôle d'accès supplémentaire. S'il existe une exception spéciale permettant à launchd de contourner les autorisations POSIX, il s'agit d'un exploit de sécurité en attente. – TheDarkKnight

+0

Dans 10.10 et 10.11, launchd s'exécute en tant que root et contourne ainsi les autorisations POSIX. Mais cela n'a rien à voir ici, car il exécute simplement 'osascript' en tant qu'utilisateur connecté et lui transmet"/Users/xxx/Library/... "* sous la forme d'une chaîne *; 'osascript' ouvre réellement le fichier et comme il fonctionne en tant qu'utilisateur, il a un accès" rwx "au dossier Library de l'utilisateur. –