For long-term use, you should configure Crowd to restart automatically when the operating system restarts. On Mac OS X, the system startup program called launchd manages long running processes – daemons or services.
Apple provides an introduction to launchd. Below we tell you how to use launchd to start Crowd automatically on Mac OS X when running Tomcat.
On this page:
Using launchd with Tomcat
The Crowd distribution (not EAR-WAR) ships with Tomcat. There is a mismatch between how launchd expects a daemon to behave, and how the default startup scripts for Tomcat operate:
- OS X's launchd expects the process it starts to run forever, but '
catalina.sh start
' starts the JVM to run Tomcat and then exits. - Tomcat provides '
catalina.sh stop
' to shut down Tomcat cleanly by connecting to a socket which Tomcat listens on, but launchd stops daemons by sending them a signal that kills the process immediately if no specific handling is included.
You will need a wrapper shell script and properties list to make launchd work with Tomcat.
Step 1. Add a Wrapper Shell Script
Add the following wrapper shell script to $CATALINA_HOME/bin
:
#!/bin/bash function shutdown() { date echo "Shutting down Crowd" $CATALINA_HOME/bin/catalina.sh stop } date echo "Starting Crowd" export CATALINA_PID=/tmp/$$ # Uncomment to increase Tomcat's maximum heap allocation # export JAVA_OPTS=-Xmx512M $JAVA_OPTS . $CATALINA_HOME/bin/catalina.sh start # Allow any signal that would kill a process to stop Tomcat trap shutdown HUP INT QUIT ABRT KILL ALRM TERM TSTP echo "Waiting for `cat $CATALINA_PID`" wait `cat $CATALINA_PID`
The above shell script starts Tomcat and then waits for the process to complete, so launchd is happy that Tomcat is still running. The script also installs a signal handler, which calls the shutdown()
function to cleanly shut down Tomcat when launchd signals the script.
You can try this script manually: Start the script, watch Crowd start, and then type ctrl-C and see Crowd shut down cleanly. (Note that it will not shut down cleanly if Tomcat has not started yet. It takes a few seconds for Tomcat to start listening on the shutdown socket.)
Step 2. Add a launchd Property List
The launchd property list (.plist
) tells launchd how to start Tomcat.
Add the following plist file to /Library/LaunchDaemons
, which is the location for system-wide services which are not part of base OS X:
<?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>Disabled</key> <false/> <key>EnvironmentVariables</key> <dict> <key>CATALINA_HOME</key> <string>/Users/myname/conf/crowd-x.x.x</string> <key>JAVA_HOME</key> <string>/Library/Java/Home</string> </dict> <key>Label</key> <string>com.atlassian.crowd</string> <key>OnDemand</key> <false/> <key>ProgramArguments</key> <array> <string>/Users/myname/conf/crowd-x.x.x/bin/launchd_wrapper.sh</string> </array> <key>RunAtLoad</key> <true/> <key>ServiceDescription</key> <string>Crowd</string> <key>StandardErrorPath</key> <string>/Users/myname/conf/crowd-x.x.x/logs/launchd.stderr</string> <key>StandardOutPath</key> <string>/Users/myname/conf/crowd-x.x.x/logs/launchd.stdout</string> <key>UserName</key> <string>root</string> </dict> </plist>
Notes:
- Replace '
/Users/myname/conf/crowd-x.x.x
' with the path to your Crowd installation. The string occurs four times in the above script. - JAVA_HOME is set to use the default JDK. On OS X version 10.4.4, the default JDK is 1.4.2. You will need to change this value if you want to use a different version of Java. For example, if you want to use JDK 1.5, you will need to change JAVA_HOME to
/System/Library/Frameworks/JavaVM.framework/Versions/1.5
. - In the above script, we have specified '
root
' as theUserName
. If necessary, change the UserName to the user you want Tomcat to run as.
Starting and Stopping Crowd Manually
To start and stop Crowd manually, use the following commands:
- Start:
cd /Library/LaunchDaemons
sudo launchctl load -w crowd.plist
- Stop:
cd /Library/LaunchDaemons
sudo launchctl unload -w crowd.plist
Troubleshooting
- Make sure both files
launch_wrapper.sh
andcrowd.plist
have the necessary file privileges. - Check the console logging and log file for any abnormalities.