Recently I spent some time working on improving my init scripts for Tomcat 6.x in a production environment running Ubuntu. One of the major problems we had encountered was that occasionally Tomcat refuses to shut down completely and requires a kill -9 to stop it. The standard init scripts I had seen didn't solve this problem at all.
Laliluna has a great article that focuses on RedHat, CentOS and Fedora. Unfortunately, their scripts didn't work correctly under Ubuntu 8.04 LTS. As a result, I spent some time modifying their scripts to get them to work correctly under Unbuntu. Many thanks to Laliluna for doing the heavy work.
Without any further ado, here's what I put together:
#!/bin/bash # # Startup script for Jakarta Tomcat # Script should work on Ubuntu Linux. # WARNING: The script does not allow to run Tomcat on privileged ports as non root user. # For this use case try : http://tomcat.apache.org/tomcat-6.0-doc/setup.html and http://commons.apache.org/daemon/jsvc.html # # Should start normally after the databases and before http server # chkconfig: 345 80 10 # description: Jakarta Tomcat Java Servlet/JSP Container # processname: tomcat # pidfile: /var/run/tomcat/tomcat.pid ##### In this area you can find settings which are likely to change frequently #### JAVA=/opt/java/current/bin/java # unprivileged user running Tomcat server tomcatuser=tomcat # servicename used as pidfile and lockfile name, must correspond to 'processname:' at the top of this file # If not linux will not detect the running service during runlevel switch and will not shut it down normally servicename=tomcat # folder where Tomcat is installed CATALINA_HOME=/opt/tomcat # Options for the JVM JAVA_OPTS="$JAVA_OPTS -Xms1024m -Xmx2048m -XX:MaxPermSize=512m -XX:PermSize=128m" JAVA_OPTS="$JAVA_OPTS -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:ParallelGCThreads=4 JAVA_OPTS="-Djavax.servlet.request.encoding=UTF-8 -Djavax.servlet.response.encoding=UTF-8 -Dfile.encoding=UTF-8 $JAVA_OPTS" ##### End of frequent settings area ##### pidfile=/var/run/tomcat/$servicename lockfile=/var/lock/$servicename #runsecure=1 #starts tomcat with java security runsecure=0 # Optional additional libs you would like to add to the classpath (= JVM Option -classpath) CLASSPATH="" # Optional Java Security Socket extension # CLASSPATH="$CLASSPATH":"$JSSE_HOME"/lib/jcert.jar:"$JSSE_HOME"/lib/jnet.jar:"$JSSE_HOME"/lib/jsse.jar # path to Tomcat lib CLASSPATH="$CLASSPATH":"$CATALINA_HOME"/bin/bootstrap.jar # Directory holding configuration, defaults to CATALINA_HOME # In a Tomcat cluster you might reuse the servicename to identify the base directory CATALINA_BASE="$CATALINA_HOME" # server log during startup / shutdown logfile=$CATALINA_BASE/logs/catalina.out # endorsed allows to overwrite JVM libs -> JVM option -Djava.endorsed.dirs #JAVA_ENDORSED_DIRS="$CATALINABASEDIR"/endorsed # Define the java.io.tmpdir to use for Catalina CATALINA_TMPDIR="$CATALINA_BASE"/temp # Set juli LogManager if it is present if [ -r "$CATALINA_BASE"/conf/logging.properties ]; then JAVA_OPTS="$JAVA_OPTS -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager" LOGGING_CONFIG="-Djava.util.logging.config.file=$CATALINA_BASE/conf/logging.properties" fi #### End of settings ##### # build java command to start Tomcat command="$JAVA $JAVA_OPTS $LOGGING_CONFIG $CATALINA_OPTS $LOGGING_CONFIG \ -Djava.endorsed.dirs=$JAVA_ENDORSED_DIRS -classpath $CLASSPATH \ -Dcatalina.base=$CATALINA_BASE \ -Dcatalina.home=$CATALINA_HOME \ -Djava.io.tmpdir=$CATALINA_TMPDIR" if [ "$runsecure" = "1" ]; then command="$command -Djava.security.manager -Djava.security.policy=$CATALINA_BASE/conf/catalina.policy" fi command="$command org.apache.catalina.startup.Bootstrap" start() { echo $"Starting $servicename based at $CATALINA_BASE " daemon --user=$tomcatuser --pidfile=$pidfile --output=$logfile -- $command start RETVAL=$? [ "$RETVAL" = 0 ] && touch $lockfile echo } stop() { echo -n $"Stopping $prog: " if [ ! -r $pidfile ]; then echo "Pidfile $pidfile cannot be read" RETVAL=1 return fi # Sends TERM signal first and kills finally after 10 seconds start-stop-daemon --pidfile $pidfile -R 10 --stop RETVAL=$? [ $RETVAL = 0 ] && rm -f ${lockfile} ${pidfile} echo } version() { $JAVA -classpath $CATALINA_HOME/lib/catalina.jar org.apache.catalina.util.ServerInfo RETVAL=$? } case "$1" in start) start ;; stop) stop ;; restart) stop start ;; version) version ;; status) status -p $pidfile $servicename RETVAL=$? ;; *) echo $"Usage: $0 {start|stop|restart|version|status}" RETVAL=1 esac exit $RETVAL
This website runs on a pair of drives in a RAID-1 configuration, as do several pairs of drives in my home that I use for storing media (music, movies, television, etc.). On all servers, I run software raid in Linux using mdadm. For some reason, I can never remember the simple syntax for checking the status of an array:
$ sudo /sbin/mdadm -QD /dev/md0 /dev/md0: Version : 00.90.03 Creation Time : Fri Jun 19 06:16:37 2009 Raid Level : raid1 Array Size : 104320 (101.89 MiB 106.82 MB) Used Dev Size : 104320 (101.89 MiB 106.82 MB) Raid Devices : 2 Total Devices : 2 Preferred Minor : 0 Persistence : Superblock is persistent Update Time : Wed Sep 16 00:22:58 2009 State : clean Active Devices : 2 Working Devices : 2 Failed Devices : 0 Spare Devices : 0 UUID : b185a678:1789acb9:327678ee:0f02177d Events : 0.14 Number Major Minor RaidDevice State 0 3 1 0 active sync /dev/hda1 1 3 65 1 active sync /dev/hdb1
The State line and Working Devices are the most important for me. In this case, they indicate the array is just fine and both drives are working.
A few months back I got a new 12.1" System76 Darter laptop and I finally decided to setup dual monitors on Kubuntu 9.10 (Karmic Koala).What I wanted was to have my laptop LCD on the left at 1280x800 and my ViewSonic LCD panel on the right running at 1680x1050. Apparently I'm old-skool, because I'm used to hacking away at my xorg.conf just to get dual monitor support to work under Linux. Somehow I never knew about xrandr, KRandR, etc.
ThinkWiki has a great article using XRandR (http://www.thinkwiki.org/wiki/Xorg_RandR_1.2) that really helped me out. When I first launched Kubuntu the two screens were mirrored. So, I tried to use KRandR to set the screens side by side. Unfortunately, it seemed to be confused - it saw there were two outputs, but it thought they were the same screen. This is where the ThinkWiki article came in handy.
With the later versions of Xorg, Ubuntu doesn't even include an xorg.conf. Instead of even monkeying around with Xorg, I just used xrandr. There were three key steps:
$ xrandr -q Screen 0: minimum 320 x 200, current 2960 x 1050, maximum 8192 x 8192 VGA1 connected 1680x1050+1280+0 (normal left inverted right x axis y axis) 474mm x 296mm 1680x1050 60.0*+ 1280x1024 75.0 1152x864 75.0 1024x768 75.1 70.1 60.0 832x624 74.6 800x600 72.2 75.0 60.3 56.2 640x480 72.8 75.0 66.7 60.0 720x400 70.1 LVDS1 connected 1280x800+0+0 (normal left inverted right x axis y axis) 261mm x 163mm 1280x800 60.0*+ 1024x768 60.0 800x600 60.3 640x480 59.9 DP1 disconnected (normal left inverted right x axis y axis)
This shows I have two main outputs connected right now: VGA1 and LVDS1. Under Ubuntu 9.04 (Jaunty), my outputs were labeled VGA and LVDS.
Once we know the name of the outputs, we can disable the secondary output. This is the key step to getting a large virtual desktop working without something like Xinerama. If you don't disable the secondary output, Xorg never seems to be able to successfully distinguish between the two outputs.
$ xrandr --output VGA1 --off
When we re-enable the outputs we can specify the location of the secondary display, relative to the primary. We can also let xrandr figure out the best resolution for each:
$ xrandr --output LVDS --auto --output VGA --auto --right-of LVDS
Voila. Finally, if you want to automate this, the ThinkWiki article has a great little script you can use. However, I did have to modify it slightly ... I had to force the VGA1 output off before setting them both to auto. Without that, the secondary screen remained blank.
# If an external monitor is connected, place it with xrandr # External output may be "VGA" or "VGA-0" or "DVI-0" or "TMDS-1" EXTERNAL_OUTPUT="VGA1" INTERNAL_OUTPUT="LVDS1" # EXTERNAL_LOCATION may be one of: left, right, above, or below EXTERNAL_LOCATION="right" case "$EXTERNAL_LOCATION" in left|LEFT) EXTERNAL_LOCATION="--left-of $INTERNAL_OUTPUT" ;; right|RIGHT) EXTERNAL_LOCATION="--right-of $INTERNAL_OUTPUT" ;; top|TOP|above|ABOVE) EXTERNAL_LOCATION="--above $INTERNAL_OUTPUT" ;; bottom|BOTTOM|below|BELOW) EXTERNAL_LOCATION="--below $INTERNAL_OUTPUT" ;; *) EXTERNAL_LOCATION="--left-of $INTERNAL_OUTPUT" ;; esac xrandr |grep $EXTERNAL_OUTPUT | grep " connected " if [ $? -eq 0 ]; then xrandr --output $EXTERNAL_OUTPUT --off xrandr --output $INTERNAL_OUTPUT --auto --output $EXTERNAL_OUTPUT --auto $EXTERNAL_LOCATION # Alternative command in case of trouble: # (sleep 2; xrandr --output $INTERNAL_OUTPUT --auto --output $EXTERNAL_OUTPUT --auto $EXTERNAL_LOCATION) & else xrandr --output $INTERNAL_OUTPUT --auto --output $EXTERNAL_OUTPUT --off fi
Place this /etc/X11/Xsession.d as 45custom_xrandr-settings and it will automatically run.
I love Beryl/Compiz, b0ut I have found them to be a bit finicky (understandably). Under Kubuntu Feisty with an Nvidia 7300 Go video card, I ran into a tremendously annoying problem where the title bars for windows were not visible. Looking at the output for beryl-manager, I saw the following:
No GLXFBConfig for Depth 32
I found this puzzling because I’m not running at a 32 bit depth - I’m running at 24. Again, the Ubuntu forums saved me:
Recent comments
13 weeks 3 days ago