J'ai la commande suivante launchctl en tant que fichier .plist. Il est chargé et configuré pour s'exécuter une fois par jour, mais il doit être exécuté en tant que root et je ne sais pas comment le vérifier.
En outre, ce travail cron consiste essentiellement à insérer des CD dans un répertoire et à exécuter une commande. Je suis sûr que launchd dispose d'un meilleur moyen de spécifier le répertoire dans lequel il est supposé exécuter la commande.
Comment savoir s'il est exécuté en tant que root et existe-t-il un meilleur moyen d'écrire cela?
<?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>dev.project.frontpage.feedparser</string>
<key>ProgramArguments</key>
<array>
<string>cd</string>
<string>/Users/eman/src/project/trunk/includes/;</string>
<string>./feed-parser.php</string>
<string>-c</string>
<string>./feed-parser-config.xml</string>
</array>
<key>QueueDirectories</key>
<array/>
<key>StartCalendarInterval</key>
<dict>
<key>Hour</key>
<integer>12</integer>
<key>Minute</key>
<integer>0</integer>
</dict>
<key>WatchPaths</key>
<array/>
</dict>
</plist>
Dans quel dossier le .plist
est-il stocké?
launchd
lance Daemons (/Library/LaunchDaemons
ou /System/Library/LaunchDaemons
) en tant que root et les exécutera que les utilisateurs soient connectés ou non. Les agents de lancement (/Library/LaunchAgents/
ou ~/Library/LaunchAgents/
) sont exécutés lorsqu'un utilisateur est connecté en tant que cet utilisateur. Vous ne pouvez pas utiliser setuid pour changer l'utilisateur qui exécute le script sur des démons.
Parce que vous voudrez l’ajouter dans /Library/LaunchDaemons
, vous voudrez vous assurer de le charger dans launchd
avec les privilèges d’administrateur (par exemple, Sudo launchctl load -w /Library/LaunchDaemons/com.Apple.samplelaunchdscript.plist
).
Consultez man launchd
pour plus d'informations.
Avez-vous essayé d'utiliser l'un des éditeurs launchd?
Pour être sûr qu'il soit exécuté en tant que root, je suis sûr que launchd exécutera les programmes en tant que root. Avez-vous déjà pensé à donner la propriété du script à root en utilisant chmod? De cette façon, il ne fonctionnera que s'il est exécuté en tant que root. Vous devez ensuite vérifier qu'il fonctionne.
Sudo chown root:admin script_to_run_by_launchd
Les listes de propriétés dans LaunchAgents fonctionnent également, mais vous devez charger les agents et les démons avec Sudo:
Sudo chown root /Library/LaunchAgents/test.plist
Sudo launchctl load /Library/LaunchAgents/test.plist
Si la pliste n'a pas de clé désactivée, elle est chargée lors de la prochaine connexion ou redémarre par défaut, et -w
n'est pas nécessaire.
Note technique TN2083: Démons et agents :
Un démon est un programme qui s'exécute en arrière-plan dans le cadre du système global (c'est-à-dire qu'il n'est pas lié à un utilisateur particulier). Un démon ne peut afficher aucune interface graphique; plus spécifiquement, il n'est pas autorisé de se connecter au serveur de fenêtres.
[...]
Un agent est un processus qui s'exécute en arrière-plan pour le compte d'un utilisateur particulier. Les agents sont utiles car ils peuvent faire des choses que les démons ne peuvent pas, comme accéder de manière fiable au répertoire de base de l'utilisateur ou se connecter au serveur de fenêtres.
Pour les utilisateurs de Google cherchant spécifiquement à exécuter un agent de lancement avec les privilèges root au lieu d'un démon de lancement , vous pouvez le faire par:
~/Library/LaunchAgents
Sudo
via la propriété ProgramArguments
dans votre plistNOPASSWD
pour votre application dans /etc/resolvers.d
LaunchControl m'a facilité la tâche à Yosemite. Il a une interface graphique Nice glisser-déposer pour vous aider à créer ou modifier des services. C'était surprenant de voir tous les services en cours d'exécution que je ne connaissais pas.
Pas