我需要檢查Tomcat是否在我的系統中通過shell腳本運行。如果不是,我需要捕獲進程ID並殺死Tomcat。它將如何實現?檢查Tomcat是否通過shell腳本運行
回答
爲了獲得正在運行的進程的過程中,我用這個命令:
ps x | grep [full_path_to_tomcat] | grep -v grep | cut -d ' ' -f 1
你必須要小心,雖然。它適用於我的設置,但它可能無法在任何地方運行...我有兩個tomcat安裝,一個是端口8080上的/ usr/local/tomcat和8081端口上的/ usr/local/tomcat_8081。我必須使用'/ usr/local/tomcat /'(帶最後一個斜槓)作爲full_path,否則如果tomcat_8081正在運行,它將返回2個不同的pid。
這裏是什麼這個命令執行的解釋:
1)ps x
讓你運行的PID,TTY,統計,運行時間和命令排序進程的列表。
2)將grep [full_path_to_tomcat]
應用到它將在該列表中找到[full_path_to_tomcat]模式。例如,運行ps x | grep /usr/local/tomcat/
可能讓你以下幾點:
13277 ? Sl 7:13 /usr/local/java/bin/java -Djava.util.logging.config.fil
e=/usr/local/tomcat/conf/logging.properties [...] -Dcatalina.home=/usr/local/tomca
t [...]
21149 pts/0 S+ 0:00 grep /usr/local/tomcat/
3)當我們2項,而不是一個因grep /usr/local/tomcat/
匹配的模式,讓我們將其刪除。 -v
是grep的反向匹配標誌,意思是它只會選擇與模式不匹配的行。所以,在前面的例子中,使用ps -x | grep /usr/local/tomcat/ | grep -v grep
將返回:
13277 ? Sl 7:13 /usr/local/java/bin/java -Djava.util.logging.config.fil
e=/usr/local/tomcat/conf/logging.properties [...] -Dcatalina.home=/usr/local/tomca
t [...]
4)冷,現在我們有我們需要的PID。不過,我們需要剝去其餘的一切。爲了做到這一點,我們使用cut
。該命令刪除FILE或標準輸出中的部分。 -d選項是分隔符,-f是你需要的字段。大。因此,我們可以使用空格('')作爲分隔符,並獲取與pid對應的第一個字段。運行ps x | grep /usr/local/tomcat/ | grep -v grep | cut -d ' ' -f 1
將返回:
13277
這就是你需要的。要在腳本中使用它,它很簡單:
#replace below with your tomcat path
tomcat_path=/users/tomcat/apache-tomcat-8.0.30
pid=$(ps x | grep "${tomcat_path}" | grep -v grep | cut -d ' ' -f 1)
if [ "${pid}" ]; then
eval "kill ${pid}"
fi
詳細而且很好的答案。我唯一能做的就是使用'awk'而不是'cut',如下所示: 'ps axuw | grep path/to/tomcat | grep -v grep | awk'{print $ 2} '' – atripes 2013-11-18 09:14:50
對我來說工作不正常......我的tomcat啓動了,我可以通過「ps -ef | grep tomcat」看到pid,但是上面的這個命令沒有返回任何結果 – 2017-09-15 19:56:22
@WilliansMartins是否用你的實際路徑替換了tomcat_path?你只有一個tomcat安裝,你可以使用'grep tomcat'來代替 – Tarek 2017-10-06 00:31:18
Tomcat的默認端口是8080.你可以grep它並在比較循環中使用端口狀態。
#!/bin/bash
STAT=`netstat -na | grep 8080 | awk '{print $7}'`
if [ "$STAT" = "LISTEN" ]; then
echo "DEFAULT TOMCAT PORT IS LISTENING, SO ITS OK"
elif [ "$STAT" = "" ]; then
echo "8080 PORT IS NOT IN USE SO TOMCAT IS NOT WORKING"
## only if you defined CATALINA_HOME in JAVA ENV ##
cd $CATALINA_HOME/bin
./startup.sh
fi
RESULT=`netstat -na | grep 8080 | awk '{print $7}' | wc -l`
if [ "$RESULT" = 0 ]; then
echo "TOMCAT PORT STILL NOT LISTENING"
elif [ "$RESULT" != 0 ]; then
echo "TOMCAT PORT IS LISTENINS AND SO TOMCAT WORKING"
fi
這種方式,你可以,如果你正在使用的默認端口tomcat.this將只檢查是否tomcat的運行比較script.you grep的8080端口。 那麼你可以使用端口檢查過程 lsof的-i:8080 //如果使用8080端口
的,如果你想使用它使用該命令殺死進程以釋放端口 殺75782 //如果例如75782是使用的端口
簡單的方法來做到這一點是:
ps -ef | grep tomcat
使用此命令,你會得到:
user [id-to-kill] Date [tomcat-path]
最後一步正在查殺該過程
sudo kill -9 [id-to-kill]
恭喜你,你的程序被殺害了.Ool
它顯示了甚至tomcat沒有運行的進程'1000 8309 4960 0 20:51 pts/1 00:00:00 grep - 顏色=自動tomcat「,或者,如果你搜索任何東西不存在('neo44'),它回覆'$ ps aux | grep neo44 1000 8397 0.0 0.0 13640 952 pts/1 S + 20:53 0:00 grep --color = auto neo44' – prayagupd 2014-06-02 15:07:44
'ps -ef | grep tomcat'將在包含「tomcat」的輸出中找到任何內容,通常包括'grep tomcat'進程。你可以使用-v標誌來過濾它,例如'ps -ef | grep tomcat | grep -v grep',使用'pgrep'或者更多的發行版和特定於設置的東西,比如'service tomcat status'。 – CodeShane 2018-02-16 22:54:59
一種通過使用wget檢查服務器地址並檢查狀態的方法。
檢查此鏈接在這裏:
http://www.velvettools.com/2013/07/shell-script-to-check-tomcat-status-and.html#.VX_jfVz-X1E
TOMCAT_HOME=/usr/local/tomcat-folder/
is_Running()
{
wget -O - http://yourserver.com/ >& /dev/null
if(test $? -eq 0) then
return 0
else
return 1
fi
}
stop_Tomcat()
{
echo "shutting down......"
$TOMCAT_HOME/bin/shutdown.sh
}
start_Tomcat()
{
echo "starting......"
$TOMCAT_HOME/bin/startup.sh
}
restart()
{
stop_Tomcat
sleep 10
kill_Hanged_Processes
start_Tomcat
sleep 60
}
定義 「正在運行」。通過普通的定義,沒有運行的東西沒有進程ID,也不能被殺死。我不只是在這裏發呆,你大概的意思是「正確處理請求」,一旦你可以定義它,你就會知道如何編寫腳本。 (另外,你可能想嘗試Serverfault,他們有更多的系統監控經驗) – derobert 2012-08-10 10:11:17
@BugFinder:我試過使用這個命令, pid = $(ps -fe | grep tomcat)。這將得到上下文'tomcat'的所有進程。然後用killall。 – 2012-08-10 12:13:53