2 votes

Problème de création de répertoire à partir de script exécuté par launchd

J'ai un simple script qui crée un nouveau répertoire basé sur la date puis copie un ensemble de fichiers dans ce répertoire. Il s'exécute correctement à partir du Terminal. Lorsque je le configure pour qu'il s'exécute en tant que UserAgent, il échoue. Le journal d'erreurs montre que le chemin d'accès a été modifié pour passer de /Users/Study/xxx à /var/root/xxx . J'ai essayé de l'exécuter en tant que root à partir de Terminal et cela fonctionne toujours. Je me suis assuré que root n'est pas le propriétaire du fichier script. J'ai changé mon chemin original de ~/xxx à la /Users/Study/xxx mais pour une raison quelconque, lorsqu'il est exécuté depuis launchd, le chemin est modifié. Avez-vous une idée ?

script :

!/bin/bash

MO=$(date +%d%B%Y)
mkdir /Users/Study/Dropbox/SPID_backups/$MO
cp -r /Users/Study/WebDevelopment/SPID/*.* /Users/Study/Dropbox/SPID_backups/$MO

launchctl 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>com.spidbackup</string>
    <key>Program</key>
    <string>/Users/Study/Library/Scripts/spidbackup.sh</string>
    <key>StandardErrorPath</key>
    <string>/tmp/com.spidbackup.err</string>
    <key>StandardOutPath</key>
    <string>/tmp/com.spidbackup.out</string>
    <key>StartCalendarInterval</key>
    <array>
        <dict>
            <key>Hour</key>
            <integer>17</integer>
            <key>Minute</key>
            <integer>11</integer>
        </dict>
    </array>
    <key>WorkingDirectory</key>
    <string>/Users/Study</string>
</dict>
</plist>

1voto

klanomath Points 63400

Votre tâche de sauvegarde est (très) spécifique à l'utilisateur et n'est pas un service système, donc l'emplacement approprié pour l'agent de lancement est ~/Bibliothèque/LaunchAgents/. Si vous mettez le plist dans /Library/LaunchAgents, il sera exécuté pour le compte de chaque utilisateur connecté à ~ 5.11pm - ce qui échouera pour la plupart des utilisateurs car ils ne peuvent probablement pas accéder à certains ou à la plupart de vos dossiers/fichiers utilisateur.


Utilisez un shebang correct dans le script. #!/bin/bash.. et rendre le script exécutable : chmod +x /Users/Study/Library/Scripts/spidbackup.sh .

Supprimez complètement le plist de la base de données launchctl avec sudo launchctl remove com.spidbackup et launchctl remove com.spidbackup . Déplacez la plist vers /Users/Study/Library/LaunchAgents/, chown/chmod vers votre utilisateur et supprimez la clé. Répertoire de travail et la chaîne de caractères associée.

Enfin, rechargez l'agent avec :

launchctl load /Users/Study/Library/LaunchAgents/com.spidbackup.plist 

Les permissions et les droits de propriété des fichiers sont enfin respectés :

ls -l /Users/Study/Library/Scripts/spidbackup.sh
-rwxr-xr-x  1 study  staff  ... spidbackup.sh

ou

-rwx------  1 study  staff  ... spidbackup.sh

et

ls -l /Users/Study/Library/LaunchAgents/com.spidbackup.plist 
-rw-r--r--  1 study  staff  ... com.spidbackup.plist

en supposant que Étude est votre nom d'utilisateur.

Veuillez également vérifier l'emploi des majuscules (par exemple, study vs. Study).

0voto

Mike Points 43

Je n'ai pas vraiment la réponse mais c'était clairement quelque chose à voir avec les permissions et la propriété. J'ai recommencé avec un nouveau fichier et un nouveau plist. Tout fonctionne comme prévu. Merci pour tous les commentaires.

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X