Load or Reload a LaunchAgent from installer script

Apple has some restrictions in place to prevent access to LaunchAgents running in a user session context.

But you may want to load or refresh a LaunchAgent as part of your install without requiring the user to log out and back in.

I prefer not to require logouts and reboots in my installation packages.  Where possible, I use munki’s unattended option so software installs silently and the user is not prompted.

After some experimentation, I came up with this hacky method of getting a LaunchAgent to load from a package being installed as root.  If you have a cleaner way to accomplish this, please let me know.  Update: Please see Per Olofsson’s comment for a much better method until I update this gist.

 

About these ads

6 Comments on “Load or Reload a LaunchAgent from installer script”

  1. Patrick Fergus says:

    Try this syntax (split into multiple lines for clarity):

    loginWindowPid=`ps auwwx | grep [l]oginwindow | awk ‘{ print $2 }’`
    loggedInUser=`ps auwwx | grep [l]oginwindow | awk ‘{ print $1 }’`
    launchctl bsexec $loginWindowPid sudo -u $loggedInUser launchctl load /the/job.plist

  2. Patrick Fergus says:

    More complete:

    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

  3. [...] Crawford has an interesting post that covers reloading LaunchAgents while a user is logged in without requiring them to take action [...]

  4. Per Olofsson says:

    You’re on the right track, but you should also handle multiple login sessions. Quinn the Eskimo lays it out pretty clearly here:

    https://lists.macosforge.org/pipermail/launchd-dev/2011-January/000890.html

    I’ve adapted it in my package creation scripts here:

    https://github.com/MagerValp/Scripted-Mac-Package-Creation/blob/master/scripts/postinstall

    To unload before loading I just call launchctl bsexec twice.

    • Patrick Fergus says:

      @Per: I found that exact post when I was researching how to do this a few months ago, but could never get the syntax right. The above was suggested by our software management vendor, but I probably should revisit it.

    • Kyle Crawford says:

      Thanks for this Per. Sorry for the delayed reply :)


Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

Follow

Get every new post delivered to your Inbox.

Join 28 other followers