2017-06-20 122 views
1

我的問題會有點難以解釋,所以請耐心等待。在shell腳本中啓動Java HTTP服務器的狀態

我想寫一個shell腳本,它將啓動一個Java HTTPServer作爲後臺進程。在腳本中的相關行是看似很簡單:

java -jar "$jar.jar" &

不過,我需要以某種檢查,有沒有問題,當Java的嘗試運行jar。例如,如果我是touch Server.jar,我想捕獲java運行那個空罐子的失敗。所以,我試圖把它包裝在一個if語句中:

if ! java -jar "$jar.jar" & 
then 
    echo "Couldn't start server" >&2 
fi 

這是行不通的。不管java是否真的能夠運行jar,返回的狀態都是一樣的。我注意到如果我最後忽略了&符號,它會在jar不好的情況下執行我想要的操作。但是,這顯然會導致腳本在該行上等待,直到該jar文件良好時停止服務器,因此無法將該進程發送到後臺。

有沒有簡單的方法來完成這個?

+1

沒有,真的沒有。如果進程正在運行,那麼還沒有退出代碼。在後臺放置進程時,立即退出代碼始終爲0. – Jack

回答

3

這樣做的一個常見方式是完全忽略退出狀態,而是檢查服務器是否成功啓動

# Start server 
java -jar "$jar.jar" & 

# Wait for up to 30s 
printf "%s" "Waiting for server to respond" 
timeout=30 
until nc -z localhost 8080 || ((--timeout == 0)) 
do 
    sleep 1 
    printf "." 
done 

# Check result 
if ((timeout > 0)) 
then 
    echo "Server started successfully" 
else 
    echo "Server still not responding" 
fi 

這是賭注:超時(在這裏,它會打開端口8080爲探測由nc)內比確保流程持續運行30秒而不會死亡,因爲在快樂的情況下,它會很快地繼續下去。

如果進程死亡,您可以另外立即中止(與kill -0 $!一起檢查)。這可能適用於您的java命令,但其他服務器(如Apache)具有在服務器繼續運行時立即退出的啓動命令。

0

您可以嘗試使用返回碼。這裏有一個例子:
➭貓script.sh

#!/bin/bash 
java -jar "$1" 
STATUS="${?}" 
if [ $STATUS -eq 0 ] 
then 
    echo "Good" 
else 
    echo "Bad" 
fi 

用法:

➭ ./script.sh good.jar 
... 
Good 

➭ ./script.sh bad.jar 
... 
Bad 
+0

服務器在此情況下不會在後臺啓動 – Petr

+0

這似乎失去了OP所表達的關鍵特徵:服務器以*背景*過程。 –

+0

@JohnBollinger是的,你是對的,我錯過了這個,對不起 –

0

我更願意用 「的pidof」 獲得進程的PID,例如:

GETPID=$(pidof java) 

if [ "${GETPID}VVV" == "VVV" ] ; then 
    echo "The process is BAD" 
else 
    echo "The process is OK" 
fi 
相關問題