Je souhaite exécuter un service de synchronisation à l'unisson qui s'exécute en arrière-plan chaque fois que je me connecte. Mais le code de statut de mon agent est 78
. Je ne sais pas pourquoi, j'ai essayé des correctifs mis en ligne, mais ça ne marche pas.
Quel est le problème?? ci-dessous est le fichier plist pour mon service.
<?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>syncmyproject</string>
<key>StandardOutPath</key>
<string>/var/log/syncmyproject.log</string>
<key>StandardErrorPath</key>
<string>/var/log/syncmyproject.log</string>
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<true/>
<key>Debug</key>
<true/>
<key>EnableGlobbing</key>
<true/>
<key>ProgramArguments</key>
<array>
<string>/usr/local/bin/unison</string>
<string>-auto</string>
<string>-batch</string>
<string>-repeat watch</string>
<string>~/home/project</string>
<string>~/project</string>
</array>
</dict>
</plist>
J'ai lu man launchctl
, trouver 78 signifie function not implemented
. Cela n'aide pas beaucoup.
Enfin, je le fais fonctionner, en fait il y avait des erreurs dans le plist, je recommande d'installer le brew cask install launchcontrol
, qui est un outil graphique pour launchctl, il peut aider à détecter les erreurs et à résoudre les problèmes.
J'ai trouvé que l'erreur concernait les autorisations . J'essayais de rediriger les erreurs et les journaux vers le répertoire /var/log
auquel mon utilisateur ne peut pas écrire. r + w l'a corrigé.
Faites également attention lorsque vous chargez vos LaunchAgents. N'utilisez pas Sudo pour charger une pliste si vous vous trouvez dans le répertoire ~/Library/LaunchAgents.
[A couru dans ce problème aussi, donc documenter ce que j'ai trouvé]
"78" est le dernier code de sortie du travail que vous exécutez. De man launchctl
:
Sans argument, répertoriez tous les travaux chargés dans launchd sur trois colonnes. La première colonne affiche le PID du travail s'il est exécuté - Ning. La deuxième colonne affiche le dernier statut de sortie du travail. Si le nombre dans cette colonne est négatif, il représente le négatif de le signal qui a arrêté le travail. Ainsi, "-15" indiquerait que le le travail s'est terminé avec SIGTERM. La troisième colonne est le libellé du travail . Si [libellé] est spécifié, imprime des informations sur le travail demandé.
C'est à dire. vous devez lire la documentation (ou le code source) pour le travail que vous commencez. (Dans mon cas, mysqld)
Il est à noter que "78" est mentionné en tant que code de sortie standard sur Linux, indiquant une erreur de configuration. Alors jetez un coup d'œil à la configuration de votre travail (et aux journaux d'erreurs?) Pour voir si vous avez quelque chose de mal configuré.
Voici ce qui m’a attiré: Sous Mac OS X, vous pouvez exécuter des scripts Shell à partir de la ligne de commande même s’il n’ya "que le script" dans le fichier . Cependant, lorsque vous les exécutez à partir de launchd, vous devez indiquer quel binaire doit exécuter le script . On suppose que lorsque vous exécutez à partir de la ligne de commande, il utilise uniquement le shell dans lequel vous vous trouvez actuellement (dans mon cas, bash), mais lorsque vous exécutez launchd, il n'y a pas de "script environnant" . ajoutée
#!/bin/sh
en tant que première ligne du fichier de script, puis cela a fonctionné.
Semblable à ce qui précède, j'avais un statut 78 car j'avais un lien symbolique dans mon chemin de script Le correctif consistait à utiliser le chemin absolu.