轉自http://blog.csdn.net/tengdazhang770960436/article/details/53906263
第一步:獲取進程號
pid=$(ssh root@$remote_host "ps -ef | grep ${tomcat_name} | grep -v grep | awk '{print $2}'"| awk '{print $2}')
第二步:殺掉進程
ssh root@$remote_host "kill -9 ${pid}"
注意:
殺掉遠程進程跟殺掉本地進程不一樣,殺掉本地進程只需要一句話就可以搞定了:
ps -ef | grep ${tomcat_name} | grep -v grep | awk '{print $2}'|xargs kill -9
但是殺掉遠程的進程不一樣,因為過濾的結果會被整體返回,如果在遠程執行這個殺掉進程的命令:
ssh root@$remote_host "ps -ef | grep ${tomcat_name} | grep -v grep | awk '{print $2}' | xargs kill -9"
你會得到錯誤的提示:
kill process java -jar tomcat-8081 kill: can't find process "root" kill: can't find process "09:42" kill: can't find process "?" kill: can't find process "00:00:44" kill: can't find process "/opt/tools/jdk1.7.0_67/bin/java" kill: can't find process "-Djava.util.logging.config.file=/opt/tools/tomcat-8081/conf/logging.properties" kill: can't find process "-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager" kill: can't find process "-Ddisconf.env=rd" kill: can't find process "-Ddisconf.conf_server_host=192.168.100.15:8015" kill: can't find process "-Ddisconf.app=ync365" kill: can't find process "-Ddisconf.version=1.0.0" kill: can't find process "-Ddisconf.user_define_download_dir=./classes" kill: can't find process "-Ddisconf.enable.remote.conf=true" kill: can't find process "-Djdk.tls.ephemeralDHKeySize=2048" kill: can't find process "-Djava.endorsed.dirs=/opt/tools/tomcat-8081/endorsed" kill: can't find process "-classpath" kill: can't find process "/opt/tools/tomcat-8081/bin/bootstrap.jar:/opt/tools/tomcat-8081/bin/tomcat-juli.jar" kill: can't find process "-Dcatalina.base=/opt/tools/tomcat-8081" kill: can't find process "-Dcatalina.home=/opt/tools/tomcat-8081" kill: can't find process "-Djava.io.tmpdir=/opt/tools/tomcat-8081/temp" kill: can't find process "org.apache.catalina.startup.Bootstrap" kill: can't find process "start"
這是因為你執行的遠程命令會返回如下結果:
root 7314 1 7 09:51 pts/0 00:00:17 /opt/tools/jdk1.7.0_67/bin/java -Djava.util.logging.config.file=/opt/tools/apache-tomcat-7.0.70/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.endorsed.dirs=/opt/tools/apache-tomcat-7.0.70/endorsed -classpath /opt/tools/apache-tomcat-7.0.70/bin/bootstrap.jar:/opt/tools/apache-tomcat-7.0.70/bin/tomcat-juli.jar -Dcatalina.base=/opt/tools/apache-tomcat-7.0.70 -Dcatalina.home=/opt/tools/apache-tomcat-7.0.70 -Djava.io.tmpdir=/opt/tools/apache-tomcat-7.0.70/temp org.apache.catalina.startup.Bootstrap start
然后 xargs kill -9 會把上面的所有的空格隔開的進程給刪除一遍,實際上他們根本不是進程,只是一個進程下面返回的描述而已,我們真正需要的進程號是第二個 7314 這個進程,因此我們需要把返回的字符串再次過濾一遍,這樣就能夠得到真正的進程號了。