2012-08-10 164 views
4

我需要檢查Tomcat是否在我的系統中通過shell腳本運行。如果不是,我需要捕獲進程ID並殺死Tomcat。它將如何實現?檢查Tomcat是否通過shell腳本運行

+0

定義 「正在運行」。通過普通的定義,沒有運行的東西沒有進程ID,也不能被殺死。我不只是在這裏發呆,你大概的意思是「正確處理請求」,一旦你可以定義它,你就會知道如何編寫腳本。 (另外,你可能想嘗試Serverfault,他們有更多的系統監控經驗) – derobert 2012-08-10 10:11:17

+0

@BugFinder:我試過使用這個命令, pid = $(ps -fe | grep tomcat)。這將得到上下文'tomcat'的所有進程。然後用killall。 – 2012-08-10 12:13:53

回答

8

爲了獲得正在運行的進程的過程中,我用這個命令:

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 
+4

詳細而且很好的答案。我唯一能做的就是使用'awk'而不是'cut',如下所示: 'ps axuw | grep path/to/tomcat | grep -v grep | awk'{print $ 2} '' – atripes 2013-11-18 09:14:50

+0

對我來說工作不正常......我的tomcat啓動了,我可以通過「ps -ef | grep tomcat」看到pid,但是上面的這個命令沒有返回任何結果 – 2017-09-15 19:56:22

+0

@WilliansMartins是否用你的實際路徑替換了tomcat_path?你只有一個tomcat安裝,你可以使用'grep tomcat'來代替 – Tarek 2017-10-06 00:31:18

0

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是使用的端口

+0

我編輯了您的帖子以修復代碼格式。爲了將來參考,{}按鈕將選擇標記爲代碼(通過在每行的前面插入4個空格)。 – derobert 2012-08-10 10:12:32

+0

很好,該解決方案爲你工作 – dansh 2012-08-10 12:25:34

+0

@gopinagh:要清楚,這是丹斯的解決方案,不是我的。很高興聽到它的工作,但。 – derobert 2012-08-10 12:30:50

1

簡單的方法來做到這一點是:

ps -ef | grep tomcat 

使用此命令,你會得到:

user [id-to-kill] Date [tomcat-path] 

最後一步正在查殺該過程

sudo kill -9 [id-to-kill] 

恭喜你,你的程序被殺害了.Ool

+0

它顯示了甚至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

+0

'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

4

一種通過使用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 
} 
+0

您能否詳細說明您的答案,並添加關於您提供的解決方案的更多描述? – abarisone 2015-06-18 10:13:37

+0

希望現在清楚。 – jafarmlp 2015-06-18 12:39:18