I was getting tired of repeatedly typing 'ps aux | grep tomcat', copying out the Process id, and passing it to kill -9. Time for some simple automation... an alias!
So, how to find the Process? First, we use ps to display a list of running processes, and the grep utility to select only the lines that contain tomcat.
I needed to make sure I was only grabbing the tomcat process. Since I only have the tomcat server being run by the tomcat user, and the output of PS starts with the user who is running the process, I could use a regular expression that matches from the beginning of the line to the word tomcat. To make sure I can use the beginning of line char (^) in my regex, I use the '-E, --extended-regexp' argument.vagrant@client1:~$ ps aux | grep tomcattomcat7 6355 0.9 26.2 1050336 63972 ? Sl 00:37 0:04 /usr/lib/jvm/default-java/bin/java -Djava.util.logging.config.file=/var/lib/tomcat7/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.awt.headless=true -Xmx128m -XX:+UseConcMarkSweepGC -Djava.endorsed.dirs=/usr/share/tomcat7/endorsed -classpath /usr/share/tomcat7/bin/bootstrap.jar:/usr/share/tomcat7/bin/tomcat-juli.jar -Dcatalina.base=/var/lib/tomcat7 -Dcatalina.home=/usr/share/tomcat7 -Djava.io.tmpdir=/tmp/tomcat7-tomcat7-tmp org.apache.catalina.startup.Bootstrap start
vagrant 7504 0.0 0.3 10460 940 pts/0 S+ 00:46 0:00 grep --color=autotomcat
My command looks something like this
I then need to pull out the second record, which contains the process ID. For that, I use awk. It simply takes the output and breaks it into 'records', by default it uses whitespace. Using 'print $2' prints out the second record.vagrant@client1:~$ ps aux | grep -E '^tomcat'tomcat7 6355 0.7 25.6 1050336 62424 ? Sl 00:37 0:05 /usr/lib/jvm/default-java/bin/java -Djava.util.logging.config.file=/var/lib/tomcat7/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.awt.headless=true -Xmx128m -XX:+UseConcMarkSweepGC -Djava.endorsed.dirs=/usr/share/tomcat7/endorsed -classpath /usr/share/tomcat7/bin/bootstrap.jar:/usr/share/tomcat7/bin/tomcat-juli.jar -Dcatalina.base=/var/lib/tomcat7 -Dcatalina.home=/usr/share/tomcat7 -Djava.io.tmpdir=/tmp/tomcat7-tomcat7-tmp org.apache.catalina.startup.Bootstrap start
Here is the updated command.
vagrant@client1:~$ ps aux | grep -E '^tomcat' | awk '{ print $2 }'6355
Most important note about the above command.... I initially forgot to use the single quote ('), and I accidentally used the double quote ("). What happens in that case is that your shell will try to do a variable substation, and replace $2 with the variable 2 ( which is usually used when you are passing arguments to a shell script, $0 is the name of the script, $1 is the first argument, $2 is the second, etc...). Since there was nothing in $2, it turned the awk command into 'print', which simply prints the entire line.
Here is the command without output using the wrong quotes.
vagrant@client1:~$ ps aux | grep -E '^tomcat' | awk "{ print $2 }"tomcat7 6355 0.6 25.6 1050336 62424 ? Sl 00:37 0:05 /usr/lib/jvm/default-java/bin/java -Djava.util.logging.config.file=/var/lib/tomcat7/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.awt.headless=true -Xmx128m -XX:+UseConcMarkSweepGC -Djava.endorsed.dirs=/usr/share/tomcat7/endorsed -classpath /usr/share/tomcat7/bin/bootstrap.jar:/usr/share/tomcat7/bin/tomcat-juli.jar -Dcatalina.base=/var/lib/tomcat7 -Dcatalina.home=/usr/share/tomcat7 -Djava.io.tmpdir=/tmp/tomcat7-tomcat7-tmp org.apache.catalina.startup.Bootstrap start
Now, that will return only the PID... but what to do to it? I need to pass it as an argument to the kill command, so I'll run it in a subshell by putting it between two backpacks (`). I use the -9 argument to force kill to kill it totally. Remember to use sudo if you aren't running as the tomcat user!
My full command now looks like this
vagrant@client1:~$ sudo kill -9 `ps aux | grep -E '^tomcat' | awk '{ print $2 }'`When successful, this command has no output.
Remember to properly quote your shell variables, happy command line fu everyone!
No comments:
Post a Comment