1

I’m using OS X Yosemite. I’m trying to run an sh script upon login, but I’m having problems. I created the following file in my /Library/LaunchAgents directory …

-rwxr-xr-x  1 root  wheel  604 Oct 19 09:24 eXist.plist

The contents of the file are as follows:

<?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>eXist</string>
        <key>Program</key>
        <string>/Applications/eXist-db/bin/startup.sh</string>
        <key>RunAtLoad</key>
        <true/>
        <key>UserName</key>
        <string>root</string>
        <key>StandardErorPath</key>
        <String>/tmp/eXistDB.err</string>
        <key>StandardOutputPath</key>
        <string>/tmp/eXistDB.out</string>
    </dict>
</plist>

However, nothing is getting run (at least no output files are getting generated) and I can’t figure out why. I have verified the path exists. How can I get my script to run upon login?

Edit:

To prove the path exists, here is the output when tryihng the path in the script versus what was suggested ...

Daves-MacBook-Pro-2:~ davea$ ls /Applications/eXist-db/bin/startup.sh 
/Applications/eXist-db/bin/startup.sh
Daves-MacBook-Pro-2:~ davea$ ls /Applications/eXist-db.app/Contents/Resources/eXist-db/bin/startup.sh
ls: /Applications/eXist-db.app/Contents/Resources/eXist-db/bin/startup.sh: No such file or directory
  • Is my /Library/LaunchAgents rather /Library/LaunchAgents/ or ~/Library/LaunchAgents/? – klanomath Oct 19 '15 at 15:34
1

You made some mistakes in your plist:

  • /Applications/eXist-db/bin/startup.sh probably doesn't exist if you have installed eXist-db 2.2

    A valid path is /Applications/eXist-db.app/Contents/Resources/eXist-db/bin/startup.sh

  • StandardErorPath and StandardOutputPath are no valid keys

    Valid keys are StandardErrorPath and StandardOutPath

  • probably the root <-> launchd problem already addressed by patrix

  • the plist doesn't have to be executable

To start the app after logging in with your user simply add it to System Preferences -> Users & Groups -> Your user -> Login Items


To start eXist-db 2.0 at boot time and jetty after logging in your user you have to do the following:

If you haven't done this already, first enter:

sudo /Applications/eXist-db/tools/wrapper/bin/exist.sh install

to install a LaunchDaemon org.tanukisoftware.wrapper.eXist-db.plist in /Library/LaunchDaemons/. If you want to add a StandardErrorPath and StandardOutPath modify the file with sudo nano /Library/LaunchDaemons/org.tanukisoftware.wrapper.eXist-db.plist.

It should look like this finally:

<?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>Disabled</key>
    <true/>
    <key>Label</key>
    <string>org.tanukisoftware.wrapper.eXist-db</string>
    <key>ProgramArguments</key>
    <array>
        <string>/Applications/eXist-db/tools/wrapper/bin/exist.sh</string>
        <string>launchdinternal</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>StandardErrorPath</key>
    <string>/tmp/org.tanukisoftware.wrapper.eXist-db.stderr</string>
    <key>StandardOutPath</key>
    <string>/tmp/org.tanukisoftware.wrapper.eXist-db.stdout</string>
</dict>
</plist>

Load the daemon permanently with:

sudo launchctl load -w /Library/LaunchDaemons/org.tanukisoftware.wrapper.eXist-db.plist 

Now create a second file in ~/Library/LaunchDaemons/ named com.eXist.plist with nano. It should look like this finally:

<?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>com.eXist</string>
    <key>Program</key>
    <string>/Applications/eXist-db/bin/startup.sh</string>
    <key>RunAtLoad</key>
    <true/>
    <key>StandardErrorPath</key>
    <string>/tmp/com.eXist.stderr</string>
    <key>StandardOutPath</key>
    <string>/tmp/com.eXist.stdout</string>
</dict>
</plist>

A StandardErrorPath and StandardOutPath was added.

Load the agent permanently with:

launchctl load -w ~/Library/LaunchAgents/com.eXist.plist

Done.


Don't forget to set your (or the) JAVA_HOME variable properly. If you use a newer eXist-db release (e.g. 2.2) you have to add at least /Contents/Resources/ to the paths of exist.sh and startup.sh in the plist (please check the proper paths by opening the app bundle.


Hint: Don't use TextEdit to modify the plists: otherwise the plist files might be malformed.

  • If I go with the "Login Items" route, where does any potential error output get saved to? I tried your advice but the service doesn't start (I can verify that I can start it on my own in the termianl) – Dave Oct 19 '15 at 18:07
  • @Dave Did you install the app bundle in the dmg here? – klanomath Oct 19 '15 at 18:19
  • No -- what you pointed to is a 2.2 installatioin but our project depends on a 2.0 installation (sadly we are not able to upgrade at this time). Also I added some output to my question to prove the path listed in my .plist file exists. – Dave Oct 19 '15 at 18:38
0

You can't launch stuff as user root from your personal LaunchAgents folder as this would create a rather big security hole. There should be a message about this in /var/log/system.log.

From man launchd.plist:

UserName string

This optional key specifies the user to run the job as. This key is only applicable when launchd is running as root.

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .