Impossible de lancer le démon avec launchctl dans Yosemite


27

J'ai un démon launchd placé ~/Library/LaunchAgentsqui a bien fonctionné dans Mavericks. Mais cela ne commencera pas dans la version bêta publique de Yosemite. Le plist du démon est comme ceci (mon nom d'utilisateur est darksairavec l'UID 501)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC -//Apple Computer//DTD PLIST 1.0//EN
http://www.apple.com/DTDs/PropertyList-1.0.dtd >
<plist version="1.0">
  <dict>
    <key>Label</key>
    <string>org.darksair.retrmail</string>
    <key>ProgramArguments</key>
    <array>
      <string>/Users/darksair/bin/retrmail.py</string>
    </array>
    <key>KeepAlive</key>
    <false/>
    <key>StartInterval</key>
    <integer>300</integer>
    <key>LaunchOnlyOnce</key>
    <false/>
    <key>UserName</key>
    <string>darksair</string>
    <key>ProcessType</key>
    <string>Standard</string>
    <key>EnvironmentVariables</key>
    <dict>
      <key>PATH</key>
      <string>/Users/darksair/Python/bin:/Users/darksair/Python3/bin:/Users/darksair/bin:/usr/local/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin</string>
    </dict>
    <key>StandardOutPath</key>
    <string>/Users/darksair/logs/retrmail.log</string>
    <key>StandardErrorPath</key>
    <string>/Users/darksair/logs/retrmail.log</string>
  </dict>
</plist>

Fondamentalement, il est censé s'exécuter ~/bin/retrmail.pytoutes les 5 minutes.

Je remarque que dans Yosemite launchd est mis à niveau vers 2.0, et launchctl a de nouvelles commandes. j'ai essayé

sudo launchctl kickstart user/501/org.darksair.retrmail

et il a dit

Could not find service "org.darksair.retrmail" in domain for uid: 501

J'ai aussi essayé la vieille école

sudo launchctl load ~/Library/LaunchAgents/retrmail.plist

et il a dit

/Users/darksair/Library/LaunchAgents/retrmail.plist: Path had bad ownership/permissions

Le dossier est la propriété de moi et du groupe du personnel. J'ai essayé les autorisations 644 et 600 avec la même erreur.

Alors, quelqu'un sait-il comment lancer correctement un démon launchd dans Yosemite?


MISE À JOUR: On dirait que mon fichier d'agent de lancement doit appartenir à root:wheel. Après avoir chown, j'ai essayé

sudo launchctl load ~/Library/LaunchAgents/retrmail.plist

et il n'a émis aucune erreur. Et je pense que mon démon fonctionne correctement. Je vais laisser cette question ouverte car je me souviens que le document launchd indique clairement que le fichier de l'agent de lancement peut appartenir à l'utilisateur exécutant le démon.


UPDATE2: Non, il ne fonctionnait pas correctement. Il n'a été exécuté qu'une seule fois, mais pas à nouveau, comme s'il était déchargé.


MISE À JOUR3: J'ai mis à niveau vers la version 3 publique de Yosemite et j'ai changé mon agent pour celui-ci

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC -//Apple Computer//DTD PLIST 1.0//EN
http://www.apple.com/DTDs/PropertyList-1.0.dtd >
<plist version="1.0">
  <dict>
    <key>Label</key>
    <string>org.darksair.retrmail</string>
    <key>ProgramArguments</key>
    <array>
      <string>/Users/darksair/bin/retrmail.py</string>
    </array>
    <key>StartInterval</key>
    <integer>300</integer>
    <key>UserName</key>
    <string>darksair</string>
    <key>EnvironmentVariables</key>
    <dict>
      <key>PATH</key>
      <string>/Users/darksair/Python/bin:/Users/darksair/Python3/bin:/Users/darksair/bin:/usr/local/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin</string>
    </dict>
    <key>StandardOutPath</key>
    <string>/Users/darksair/logs/retrmail.log</string>
    <key>StandardErrorPath</key>
    <string>/Users/darksair/logs/retrmail.log</string>
  </dict>
</plist>

J'ai rechargé cet agent, et je pense que maintenant il fonctionne correctement. Je laisse toujours cette question ouverte parce que je ne sais pas ce qui ne va pas avec mon plist précédent.


En conclusion, ce que j'ai trouvé, c'est que je dois changer le propriétaire du plist root:wheelpour le charger.


Est-ce que cela fonctionne dans Yosemite final?
TJ Luoma

@TJLuoma: oui. Tant que le plist appartient à root: wheel.
MetroWind

Réponses:


21

De man launchctl

Notez que les fichiers de configuration par utilisateur (LaunchAgents) doivent appartenir à root (s'ils se trouvent dans / Library / LaunchAgents) ou à l'utilisateur qui les charge (s'ils se trouvent dans $ HOME / Library / LaunchAgents). Tous les démons à l'échelle du système (LaunchDaemons) doivent appartenir à root. Les fichiers de configuration doivent interdire les écritures de groupe et de monde. Ces restrictions sont en place pour des raisons de sécurité, car autoriser l'écriture dans un fichier de configuration launchd permet de spécifier quel exécutable sera lancé.

Le correctif est

sudo chmod 600 /Library/LaunchDaemons/x.plist
sudo chown root /Library/LaunchDaemons/x.plist

2
«Ou l'utilisateur qui les charge» <- C'est la partie avec laquelle j'ai un problème.
MetroWind

2
Je ne suis pas un mec unix, mais ça dit "interdire les écritures de groupe et du monde". Puisqu'il doit encore être lu, ne devrait-il pas l'être chmod 644?
Jason

5

Curieusement, l'utilisation sudoétait votre problème. En utilisant sudo, vous n'étiez plus vous-même, vous n'étiez donc pas propriétaire de votre propre fichier. Supprimez sudo, répétez la commande et elle devrait charger très bien. Désolé pour l'approche philosophique de tout cela.


4

J'ai trouvé la solution.

La commande correcte dans ce cas est

launchctl bootstrap gui/501 ~/Library/LaunchAgents/retrmail.plist

Et pour décharger,

launchctl bootout gui/501 ~/Library/LaunchAgents/retrmail.plist

Je ne sais pas pourquoi launchctl loadnécessite root, mais le chargement / déchargement est de toute façon déconseillé.


La page de manuel répertorie le démarrage et non le démarrage. Je pense que la correction automatique vous a obtenu car sur ma machine, il change le démarrage en bootcut.
Steve Moser

@MetroWind J'obtiens Impossible de trouver le domaine pour l'erreur Code = 112 avec la commande ci-dessus. ce n'est pas cohérent. un indice?
Parag Bafna

Aviez-vous toujours besoin du chmod& chown?
Itachi

@Itachi, non. Laisser le propriétaire et l'autorisation par défaut devrait être correct.
MetroWind

@ParagBafna, je ne suis pas sûr. Peut-être que votre UID n'est pas 501?
MetroWind

3

Ran dans cela aussi, en essayant d'utiliser l'utilisateur, pas root .plist (comme on devrait être capable de le faire)

$ load ~/Library/LaunchAgents/com.blash.blah.plist
Could not find domain for 

J'ai été connecté à distance à cette machine alors que je n'étais PAS connecté à la console (sans tête), ce qui semblait être mon problème - au moins, les services gérés par l'utilisateur ont besoin que l'utilisateur soit connecté sur l'écran principal (j'ai fini par le faire connexion via la gestion à distance car il s'agit d'une machine sans tête)

OMI, si vous voulez que cela fonctionne même si vous n'êtes pas personnellement là pour vous connecter, vos options sont:

  • Connectez-vous automatiquement à votre compte (notez les implications de sécurité, également sans la balise UserName comme indiqué dans l'une des réponses)

  • Rendez les fichiers root possédés comme indiqué dans les diverses suggestions (redéfinissez l'utilisateur sur le vôtre avec UserName comme vous l'avez déjà)


2
Merci beaucoup. J'ai trouvé une solution dans votre réponse.
Retraut

2

Voici une idée idiote.

J'ai juste eu la même erreur, également après avoir mis à niveau vers Yosemite. J'ai supposé à tort que cela signifiait une mauvaise propriété / autorisations sur le fichier .plist, alors qu'en fait, pour une raison quelconque, le binaire auquel je faisais référence dans le plist (dans mon cas cassandra), avait perdu son bit exécutable.

chmod + x'ing l'a corrigé.

Ce n'est probablement pas votre problème, mais cela pourrait valoir le coup :)


Cela ne s'applique cependant pas à mon cas. Mon exécutable a le bit d'autorisation x. Mais merci pour la réponse quand même. J'espère que cela peut aider d'autres personnes.
MetroWind

2

Retirez la UserNameclé et la chaîne.

Le problème est que la UserNameclé ne peut être utilisée que si le processus est démarré par root. Il ne peut être démarré en tant que root que si le plist appartient à root. Fondamentalement, le processus est démarré par root et est ensuite soumis à l'utilisateur spécifié. Si vous souhaitez que ce processus s'exécute en tant que vous-même, placez le plist dans votre dossier ~ / Library / LaunchAgents et supprimez la clé UserName.


Cela fonctionne après avoir supprimé l'option 'UserName' pour zabbix_agend. Merci! - gist.github.com/chusiang/04db38f5173784e33b68
Chu-Saing Lai

Étrange… Il ne se chargera toujours pas après avoir supprimé la chose «UserName»…
MetroWind

1

Avez-vous essayé de recharger manuellement un agent disposant des autorisations utilisateur? Je ne comprends pas entièrement pourquoi tout cela est requis, mais je pense que vous devez être attaché à votre domaine d'utilisateurs (auquel il semble que vous ne soyez pas attaché lorsque vous exécutez en tant que root). L'utilisation de ces fonctions pour rattacher a fonctionné pour moi.

function as_user {
    local user="$1"
    local user_pid=$(ps -axj | awk "/^$user / {print \$2;exit}")
    local command="sudo launchctl bsexec $user_pid sudo -u '$user' $2"
    echo "Running:"
    echo "$command"
    eval $command
}

function as_current_user {
    as_user "$(whoami)" "$*"
}

function reload_agent {
    as_current_user launchctl unload "$1"
    as_current_user launchctl load "$1"
}

Vous utiliseriez ceci comme suit:

reload_agent ~/Library/LaunchAgents/com.hw.helloworld.plist

Le bsexec vous remet dans votre domaine et vous permet d'ajouter la tâche en tant que lanceur d'utilisateur.


Il dit: /Users/darksair/Library/LaunchAgents/retrmail.plist: opération déjà en cours. À ce stade, mes questions sont essentiellement les suivantes: pourquoi la commande kickstart n'a-t-elle pas fonctionné? Et pourquoi dois-je définir la propriété plist sur root…?
MetroWind

1
Vous ne devez PAS définir le propriétaire de votre fichier plist sur root; tout dans ~ / Library / LaunchAgents doit appartenir à l'utilisateur auquel appartient ce répertoire. J'ai obtenu l'opération déjà en cours lorsque je n'ai pas déchargé la commande avant de la charger. Utilisez-vous la fonction que j'ai fournie?
imalison

Oui. J'utilisais tes fonctions. Et j'ai
déchargé

J'ai juste essayé de charger le premier plist que vous avez fourni et cela a fonctionné pour moi. Quelles autorisations sont définies pour le fichier?
imalison

C'est un morceau de code incroyable pour tant de choses. J'utilise un mélange de marionnettes et de scripts bash personnalisés pour gérer de nombreux appareils macOS différents, et des problèmes aléatoires parce que la session d'audit de sécurité ou le domaine utilisateur n'est pas correct sont si courants. Bon travail!
Andrew White
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.