web-dev-qa-db-fra.com

Impossible de lancer le démon avec launchctl dans Yosemite

J'ai un démon launchd placé dans ~/Library/LaunchAgents qui a bien fonctionné dans Mavericks. Mais cela ne commencera pas dans la version bêta publique de Yosemite. Le plist de démon est comme ceci (mon nom d'utilisateur est darksair avec 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>

En gros, il est supposé exécuter ~/bin/retrmail.py toutes les 5 minutes.

Je remarque que dans Yosemite, launchd est mis à niveau vers la version 2.0 et que launchctl dispose 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 appartient à moi et au groupe de personnel. J'ai essayé les deux permissions 644 et 600 avec la même erreur.

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


UPDATE: 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 commis aucune erreur. Et je pense que mon démon fonctionne correctement. Je laisse 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 qui exécute le démon.


UPDATE2: Non, cela n’a pas fonctionné correctement. Il n'a été exécuté qu'une fois, mais pas encore, comme s'il avait été déchargé.


UPDATE3: Je suis passé à la version bêta 3 publique de Yosemite et j'ai changé d'agent pour cette version.

<?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 pliste précédent.


En conclusion, ce que j'ai trouvé est que je dois changer le propriétaire du plist en root:wheel afin de le charger.

27
MetroWind

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

Cependant, je ne sais pas pourquoi launchctl load nécessite la racine, mais le chargement/déchargement est de toute façon déconseillé.

4
MetroWind

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 à $ HOME/Library/LaunchAgents). Tous les démons 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 sur un fichier de configuration launchd permet de spécifier quel exécutable sera lancé.

Fix est

Sudo chmod 600 /Library/LaunchDaemons/x.plist
Sudo chown root /Library/LaunchDaemons/x.plist
21
diimdeep

Curieusement, votre problème était d'utiliser Sudo. 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 le chargement devrait être parfait. Désolé pour l'approche philosophique à tout.

5
AlexPantea

Couru dans cela aussi, en essayant d'utiliser utilisateur. Plist non détenu par root (comme on devrait pouvoir le faire)

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

J'étais ssh-ed dans cette machine à distance 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é à l'écran principal (j'ai fini par le faire se connecter via la gestion à distance car il s'agit d'une machine sans tête)

IMO, 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 l'implication en matière de sécurité, également sans la balise UserName, comme indiqué dans l'une des réponses)

  • Attribuez aux fichiers la propriété de la racine, comme indiqué dans les différentes suggestions (redéfinir l'utilisateur sur le vôtre avec le nom d'utilisateur que vous avez déjà)

3
nhed

Supprimez la clé et la chaîne UserName.

Le problème est que la clé UserName 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 lancé par root, puis soumis à l'utilisateur spécifié. Si vous voulez que ce processus s'exécute vous-même, placez la plist dans votre dossier ~/Library/LaunchAgents et supprimez la clé UserName.

2
Peter T Bosse II

Voici une idée idiote.

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

chmod + x'ing l'a corrigé.

Probablement pas votre problème, mais pourrait valoir le coup :)

2

Avez-vous essayé de recharger manuellement un agent disposant d'autorisations d'utilisateur? Je ne comprends pas tout à fait pourquoi rien de tout cela est nécessaire, mais je pense que vous devez être attaché à votre domaine d'utilisateurs (auquel il semble que vous ne soyez pas attaché lorsque vous vous exécutez en tant que root). Utiliser ces fonctions pour se 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

Bsexec vous remet dans votre domaine et vous permet d'ajouter la tâche en tant qu'utilisateur lanceur.

1
imalison