4 votes

MacOS Catalina : exécuter bash script au démarrage avec launchctl

Avant la mise à jour vers Catalina (10.15.1), mon agent basé sur un bash script fonctionnait parfaitement.

J'avais paramétré l'agent afin d'exécuter le bash script au démarrage. Voici le fichier 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>mark.battery.info</string>
        <key>Program</key>
        <string>/Users/mark/Dropbox/Exec/BatteryInfoOnBoot.sh</string>
        <key>RunAtLoad</key>
        <true/>
    </dict>
</plist>

Après la dernière mise à jour, j'ai remarqué que le script (BatteryInfoOnBoot.sh) n'était plus chargé au démarrage et si j'exécute la commande :

launchctl list | grep mark
-   1   mark.battery.info

J'ai lu que le statut 1 signifie :

PID - Le statut 1 signifie que le processus n'a pas suffisamment de privilèges pour accéder à certains fichiers

réf.

Le script BatteryInfoOnBoot est très simple :

#!/bin/bash

echo "~~~~~~~~~"  >> /Users/mark/Documents/battery-log.txt
date  >> /Users/mark/Documents/battery-log.txt
/Users/mark/Dropbox/Exec/BatteryInfo.sh >> /Users/mark/Documents/battery-log.txt

Au lieu de cela, BatteryInfo.sh est utilisé uniquement pour obtenir quelques informations utiles :

#!/bin/bash

echo "Current battery percentage:"
pmset -g batt | grep -Eo "\d+%" | cut -d% -f1
echo ""

echo "Cycle count:"
system_profiler SPPowerDataType | grep "Cycle Count"
echo ""

echo "Capacity stats:"
ioreg -brc AppleSmartBattery | grep -i capacity | grep -v Legacy | grep -v BatteryData | grep -v AppleRaw
echo ""

PS : le script fonctionne toujours si je l'exécute manuellement :

/Users/mark/Dropbox/Exec/BatteryInfoOnBoot.sh

Des suggestions ?

1voto

vatw Points 11

Pour moi, ce qui a marché

Je n'ai pas eu beaucoup de chance avec le processus recommandé ici par d'autres (donner un accès complet) - je voulais appeler un rsync périodiquement pour sauvegarder un dossier de travail critique sur un autre serveur (non-mac).

Même lorsque j'ai donné à cron, launchctl, launchd et rsync (je les ai tous essayés) un accès complet, je recevais des erreurs indiquant que le processus (rsync) n'avait pas accès au chemin de fichier approprié. (il y a probablement un autre processus qui m'échappe) -- Je n'aime pas non plus l'idée de donner à des choses comme 'cron' un accès complet au cas où quelque chose de malveillant serait installé dans ma crontab.

Ce qui a finalement fonctionné pour moi était un peu fou, mais j'ai écrit une application Mac rapide (ou vraiment, un "outil de ligne de commande" swift comme l'appelle Xcode), qui a juste exécuté la commande shell nécessaire que je voulais de toute façon - et modifié mon agent utilisateur pour appeler l'application swift compilée - puis le système d'exploitation me demanderait d'accorder l'accès à ~/Documents pour l'application swift, qui a ensuite lancé le shell script (qui a ensuite appelé rsync) - whew.

Mon application Swift compte environ 5 lignes :

//localrsync
//main.swift

import Foundation

let task = Process()
task.launchPath = "~/bin/backDocsRsync.sh"
task.launch()
task.waitUntilExit()
print(task.terminationStatus)

et ensuite j'ai juste mis le produit compilé de Xcode dans mon dossier ~/bin, et j'ai pointé mon UserAgent à cela :

<?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>local.backdocs.rsync</string>
    <key>ProgramArguments</key>    
    <array>
        <string>~/bin/localrsync</string>
    </array>
    <key>StartInterval</key> 
    <integer>7200</integer>
    <key>StandardErrorPath</key>
    <string>~/Library/Logs/rsync.log</string>
    <key>StandardOutPath</key>
    <string>~/Library/Logs/rsync.log</string>
</dict>
</plist>

(et oui, je sais qu'il y a de "meilleures" méthodes que rsync, mais celle-ci fonctionne bien pour la combinaison de différents matériels et systèmes d'exploitation dont je dispose).

Pour faire tout cela, il faut que Xcode soit installé, ou au moins disponible, ce qui nécessite au moins un compte gratuit Apple Developer, et peut-être d'autres choses. Je ne sais pas si vous pouvez compiler des applications Mac auto-signées sans payer pour un profil de provisionnement de développeur ou non, donc si vous voulez vraiment le faire, je ne sais pas trop quoi vous recommander.

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