Mon CV

Recharger un LaunchAgent

30 avril 2013

Cette fois ci une astuce (et des propositions intéressantes également dans les commentaires) en provenance de l’excellent blog http://patternbuffer.wordpress.com de Kyle Crawford.

L’OS d’Apple impose des restrictions sur l’accès aux LaunchAgents s’exécutant depuis une session utilisateur, et il est donc nécessaire pour recharger un LaunchAgent depuis une session utilisateur, de se déconnecter.

On découvre sur ce billet une approche intéressante permettant, pour ceux qui le souhaitent, d’intégrer dans leurs scripts, notamment pour la construction de packages d’installation, de charger ou recharger un LaunchAgent en contournant cette restriction.

Le principe consiste à appeler des fonctions AppleScript au travers du Shell grâce à “osascript” :

#!/bin/bash
# if someone is logged in
if who | grep -q console; then
  # get the logged in user's uid
  LOGGED_IN_UID=`ls -ln /dev/console | awk '{ print $3 }'`
  # use the uid and pgrep to find the Finder process id
  FINDER_PID=`pgrep -U ${LOGGED_IN_UID} Finder`
  # use launchctl bsexec to run applescript code in the same Mach bootstrap namespace hierachy as the Finder
  launchctl bsexec "${FINDER_PID}" osascript -e '
  tell app "Finder"
    do shell script "
      launchctl unload -S Aqua /Library/LaunchAgents/com.company.agent.plist
      launchctl load -S Aqua /Library/LaunchAgents/com.company.agent.plist
    "
  end tell
  '
fi

Une autre proposition intéressante soumise en commentaire sur ce même blog :

loggedInUser=`who | grep console | awk ‘{ print $1 }’`
if [ ! -z $loggedInUser ]
then
launchctl bsexec `ps auwwx | grep [l]oginwindow | awk ‘{ print $2 }’` sudo -u $loggedInUser launchctl load /Library/LaunchAgents/com.company.agent.plist
fi

Evidemment, si vous avez des commentaires ou propositions complémentaires, n’hésitez pas !

Posted in Apple et MacintoshTags: