You can run the loader as a linux service so that it auto-starts when the machine boots up
Create a directory for the loader script, pid, and logs (feel free to change dir names etc)
mkdir -p /opt/appserv/grouperLoader
Create the bootstrap script: /opt/appserv/grouperLoader/grouperLoader.sh
#!/bin/bash ###################### # customize these vars for your env pidLocation=/opt/appserv/grouperLoader/grouperLoader.pid gshBinDirectory=/opt/appserv/tomcat_3b/webapps/grouperWs/WEB-INF/bin loaderLog=/opt/appserv/grouperLoader/grouperLoader.log ###################### cd $gshBinDirectory /usr/bin/nohup $gshBinDirectory/gsh -loader > $loaderLog 2>&1 & echo $! > $pidLocation
Create the service script: /opt/appserv/grouperLoader/grouperLoaderService.sh
#!/bin/sh # # Startup script for the Tomcat Server # # chkconfig: - 86 14 # description: Grouper loader service # processname: # pidfile: # config: # Tomcat # description: Keeps Grouper permissions in sync with file on linux server #################### CUSTOMIZE THIS FOR YOUR ENV ####################### # the user this script should run as shouldRunAs=appadmin pidLocation=/opt/appserv/grouperLoader/grouperLoader.pid #note, this should not contain the gsh command, just the parent directory gshBinDirectory=/opt/appserv/tomcat_3b/webapps/grouperWs/WEB-INF/bin #only run on daemon box of cluster. note, customize this for your env source /home/appadmin/bin/requireDaemon.sh grouperLoaderBootstrapScript=/opt/appserv/grouperLoader/grouperLoader.sh # grouperLoaderBootstrapScript is a way to su as the real user to run the loader # it has these contents # #!/bin/bash # # pidLocation=/opt/appserv/grouperLoader/grouperLoader.pid # gshBinDirectory=/opt/appserv/tomcat_3b/webapps/grouperWs/WEB-INF/bin # loaderLog=/opt/appserv/grouperLoader/grouperLoader.log # # cd $gshBinDirectory # /usr/bin/nohup $gshBinDirectory/gsh -loader > $loaderLog 2>&1 & # echo $! > $pidLocation ######################################################################## # function to kill a pid, wait for exit... killPid(){ pidToKill=$1 /bin/kill $pidToKill #loop until the program is dead waitingForExit=true iterator=1 while [ "$waitingForExit" == "true" ]; do processIdToKill=`/bin/ps -fp $pidToKill | grep gsh | grep loader | cut -c10-15` if [ -n "$processIdToKill" ]; then echo Waiting for exit... else waitingForExit=false fi if [ "$iterator" -gt "10" ]; then waitingForExit=false fi let "iterator += 1" sleep 1 done processIdToKill=`/bin/ps -fp $pidToKill | grep gsh | grep loader | cut -c10-15` if [ -n "$processIdToKill" ]; then /bin/kill -KILL $pidToKill sleep 1 processIdToKill=`/bin/ps -fp $pidToKill | grep gsh | grep loader | cut -c10-15` if [ -n "$processIdToKill" ]; then echo "Cannot kill process: $processIdToKill" exit 1 fi fi } runningUser=`/usr/bin/whoami` # we only want appadmin or root to be able to do this if [ "$runningUser" != "$shouldRunAs" ]; then if [ "$runningUser" != "root" ]; then echo "ERROR: only user $shouldRunAs or root can run administer the grouperLoader service: '$runningUser'" echo exit 1 fi fi case "$1" in start) echo "Starting Grouper loader service..." #if there is a pid file, and it is running, then exit, else delete if [ -f "$pidLocation" ]; then pid=`cat $pidLocation` processId=`/bin/ps -fp $pid | grep gsh | grep loader | grep "$gshBinDirectory" | cut -c10-15` if [ -n "$processId" ]; then echo "Grouper loader is already running!" exit 1 else echo "PID file exists but loader does not seem to be running" rm $pidLocation fi fi # make sure there is not a daemon running which is not in sync with PID file processId=`/bin/ps -f | grep gsh | grep loader | grep "$gshBinDirectory" | grep -v /bin/ps | cut -c10-15` if [ -n "$processId" ]; then echo "Alert: Grouper loader is detected to be running, stopping it..." processToKill=`/bin/ps -f | grep gsh | grep loader | grep "$gshBinDirectory" | grep -v /bin/ps` echo "Killing: $processToKill" killPid $processId fi # make sure there is not a daemon running which is not in sync with PID file processId=`/bin/ps -f | grep gsh | grep loader | grep java | grep -v /bin/ps | cut -c10-15` if [ -n "$processId" ]; then echo "Alert: Grouper loader is detected to be running, stopping it..." processToKill=`/bin/ps -f | grep gsh | grep loader | grep java | grep -v /bin/ps` echo "Killing: $processToKill" killPid $processId fi # if not appadmin, then we must be root if [ ! "$runningUser" == "$shouldRunAs" ]; then su $shouldRunAs -c $grouperLoaderBootstrapScript else # if not root then we must be appadmin $grouperLoaderBootstrapScript fi echo "Grouper loader is running..." ;; stop) if [ -f "$pidLocation" ]; then pid=`cat "$pidLocation"` if [ -n "$pid" ]; then echo "Shutting down loader" killPid $pid else echo "Grouper loader was not running" fi rm $pidLocation else echo "Grouper loader was not running" fi # make sure there is not a daemon running which is not in sync with PID file processId=`/bin/ps -f | grep gsh | grep loader | grep "$gshBinDirectory" | grep -v /bin/ps | cut -c10-15` if [ -n "$processId" ]; then echo "Stopping GSH Grouper load command..." processToKill=`/bin/ps -f | grep gsh | grep loader | grep "$gshBinDirectory" | grep -v /bin/ps` echo "Killing: $processToKill" killPid $processId fi # make sure there is not a daemon running which is not in sync with PID file processId=`/bin/ps -f | grep gsh | grep loader | grep java | grep -v /bin/ps | cut -c10-15` if [ -n "$processId" ]; then echo "Stopping GSH Grouper load command..." processToKill=`/bin/ps -f | grep gsh | grep loader | grep java | grep -v /bin/ps` echo "Killing: $processToKill" killPid $processId fi echo ;; status) if [ -f "$pidLocation" ]; then pid=`cat "$pidLocation"` processId=`/bin/ps -fp $pid | grep gsh | grep loader | grep "$gshBinDirectory" | cut -c10-15` if [ -n "$processId" ]; then echo "Grouper loader is running under process ID $processId" else # make sure there is not a daemon running which is not in sync with PID file processId=`/bin/ps -f | grep gsh | grep loader | grep java | grep -v /bin/ps | cut -c10-15` if [ -n "$processId" ]; then echo "Grouper loader is running from a PID not in the PID file!" else echo "Grouper loader is not running" fi fi else # make sure there is not a daemon running which is not in sync with PID file processId=`/bin/ps -f | grep gsh | grep loader | grep java | grep -v /bin/ps | cut -c10-15` if [ -n "$processId" ]; then echo "Grouper loader is running from a PID not in the PID file!" else echo "Grouper loader is not running" fi fi ;; restart) echo -n "Restarting Grouper loader: " $0 stop sleep 5 $0 start echo "done." ;; *) echo "Usage: $0 {start|stop|restart|status}" exit 1 esac
Set permissions and register the service:
[appadmin@theprince grouperLoader]$ chmod +x /opt/appserv/grouperLoader/grouperLoader.sh [appadmin@theprince grouperLoader]$ chmod +x /opt/appserv/grouperLoader/grouperLoaderService.sh [root@theprince init.d]# ln -s /opt/appserv/grouperLoader/grouperLoaderService.sh /etc/init.d/grouperLoader [root@theprince init.d]# chkconfig --add grouperLoader [root@theprince init.d]# chkconfig --levels 345 grouperLoader on
You can test this by turning on the service, turning it on again, getting the status, etc
[appadmin@mamapalma ~]$ ps -ef | grep gsh appadmin 856 518 0 17:01 pts/0 00:00:00 grep gsh [appadmin@mamapalma ~]$ /sbin/service grouperLoader stop Grouper loader was not running [appadmin@mamapalma ~]$ /sbin/service grouperLoader status Grouper loader is not running [appadmin@mamapalma ~]$ /sbin/service grouperLoader start Starting Grouper loader service... Grouper loader is running... [appadmin@mamapalma ~]$ ps -ef | grep gsh appadmin 927 1 0 17:01 pts/0 00:00:00 /bin/sh /opt/appserv/tomcat_3b/webapps/grouperWs/WEB-INF/bin/gsh -loader appadmin 928 927 99 17:01 pts/0 00:00:09 java -Xms64m -Xmx750m -Dgrouper.home=/opt/appserv/tomcat_3b/webapps/grouperWs/WEB-INF/bin/../ -classpath /opt/appserv/tomcat_3b/webapps/grouperWs/WEB-INF/bin/../classes:/opt/appserv/tomcat_3b/webapps/grouperWs/WEB-INF/bin/../lib/*: edu.internet2.middleware.grouper.app.gsh.GrouperShellWrapper -loader appadmin 957 518 0 17:01 pts/0 00:00:00 grep gsh [appadmin@mamapalma ~]$ more /opt/appserv/grouperLoader/grouperLoader.pid 927 [appadmin@mamapalma ~]$ /sbin/service grouperLoader status Grouper loader is running under process ID 927 928 [appadmin@mamapalma ~]$ /sbin/service grouperLoader start Starting Grouper loader service... Grouper loader is already running! [appadmin@mamapalma ~]$ cat 123 > /opt/appserv/grouperLoader/grouperLoader.pid cat: 123: No such file or directory [appadmin@mamapalma ~]$ echo "123" > /opt/appserv/grouperLoader/grouperLoader.pid [appadmin@mamapalma ~]$ /sbin/service grouperLoader status Grouper loader is running from a PID not in the PID file! [appadmin@mamapalma ~]$ /sbin/service grouperLoader start Starting Grouper loader service... PID file exists but loader does not seem to be running Alert: Grouper loader is detected to be running, stopping it... Killing: appadmin 927 1 0 17:01 pts/0 00:00:00 /bin/sh /opt/appserv/tomcat_3b/webapps/grouperWs/WEB-INF/bin/gsh -loader appadmin 928 927 10 17:01 pts/0 00:00:10 java -Xms64m -Xmx750m -Dgrouper.home=/opt/appserv/tomcat_3b/webapps/grouperWs/WEB-INF/bin/../ -classpath /opt/appserv/tomcat_3b/webapps/grouperWs/WEB-INF/bin/../classes:/opt/appserv/tomcat_3b/webapps/grouperWs/WEB-INF/bin/../lib/*: edu.internet2.middleware.grouper.app.gsh.GrouperShellWrapper -loader Alert: Grouper loader is detected to be running, stopping it... Killing: appadmin 928 1 10 17:01 pts/0 00:00:10 java -Xms64m -Xmx750m -Dgrouper.home=/opt/appserv/tomcat_3b/webapps/grouperWs/WEB-INF/bin/../ -classpath /opt/appserv/tomcat_3b/webapps/grouperWs/WEB-INF/bin/../classes:/opt/appserv/tomcat_3b/webapps/grouperWs/WEB-INF/bin/../lib/*: edu.internet2.middleware.grouper.app.gsh.GrouperShellWrapper -loader Waiting for exit... Grouper loader is running... [appadmin@mamapalma ~]$ ps -ef | grep gsh appadmin 1133 1 0 17:03 pts/0 00:00:00 /bin/sh /opt/appserv/tomcat_3b/webapps/grouperWs/WEB-INF/bin/gsh -loader appadmin 1134 1133 99 17:03 pts/0 00:00:08 java -Xms64m -Xmx750m -Dgrouper.home=/opt/appserv/tomcat_3b/webapps/grouperWs/WEB-INF/bin/../ -classpath /opt/appserv/tomcat_3b/webapps/grouperWs/WEB-INF/bin/../classes:/opt/appserv/tomcat_3b/webapps/grouperWs/WEB-INF/bin/../lib/*: edu.internet2.middleware.grouper.app.gsh.GrouperShellWrapper -loader appadmin 1164 518 0 17:03 pts/0 00:00:00 grep gsh [appadmin@mamapalma ~]$ /sbin/service grouperLoader stop Shutting down loader Stopping GSH Grouper load command... Killing: appadmin 1134 1 67 17:03 pts/0 00:00:10 java -Xms64m -Xmx750m -Dgrouper.home=/opt/appserv/tomcat_3b/webapps/grouperWs/WEB-INF/bin/../ -classpath /opt/appserv/tomcat_3b/webapps/grouperWs/WEB-INF/bin/../classes:/opt/appserv/tomcat_3b/webapps/grouperWs/WEB-INF/bin/../lib/*: edu.internet2.middleware.grouper.app.gsh.GrouperShellWrapper -loader Waiting for exit... [appadmin@mamapalma ~]$ ps -ef | grep gsh appadmin 1248 518 0 17:03 pts/0 00:00:00 grep gsh [appadmin@mamapalma ~]$ /sbin/service grouperLoader start Starting Grouper loader service... Grouper loader is running... [appadmin@mamapalma ~]$ /sbin/service grouperLoader status Grouper loader is running under process ID 1279 [appadmin@mamapalma ~]$ /sbin/service grouperLoader status Grouper loader is running under process ID 1279 [appadmin@mamapalma ~]$ /sbin/service grouperLoader status Grouper loader is running under process ID 1280