2012-05-29 26 views
2

Jetty 8的tar.gz分發中包含的jetty.sh腳本似乎已被破壞。Jetty沒有通過Linux上的服務腳本停止

開始碼頭工作正常,但在執行

sudo ./jetty.sh stop 

仍有工作掛在後。

原因是在啓動過程中創建了兩個進程,一個是由jetty.sh創建的start.jar,另一個是第二個。但是,只記錄start.jar啓動的PID。因此,在停止期間,只有這部分jetty運行時進程停止。

在Stackoverflow上也有類似的問題。例如,in a very simple upstart script is provided,其也遭受上述相同問題。

有誰知道如何修復腳本,以便兩個進程都被殺死?

回答

2

第二個過程啓動,因爲你的start.ini使用「--exec」選項。

這是需要高級更改JVM的配置的高級選項,例如指定bootclasspath。

大多數人不需要此功能。

只需從start.ini中刪除「--exec」即可防止第二個進程啓動。

0

我通過手動殺死所有子進程來修復腳本。這裏是差異:

--- /etc/init.d/jetty 2012-05-29 12:59:09.439511236 +0200 
+++ jetty.sh 2012-05-29 12:58:13.615513127 +0200 @@ -461,11 +461,23 @@ 
    stop) 
    echo -n "Stopping Jetty: " 
    if type start-stop-daemon > /dev/null 2>&1; then 
     echo $JETTY_PID 

+  # FIXME: start-stop-daemon isn't killing child process 
+  JETTY_PID_NO=`cat "$JETTY_PID"` 
+  for child_pid in `ps -o pid --no-headers --ppid $JETTY_PID_NO` 
+  do 
+  kill -HUP $child_pid 
+  done 
     start-stop-daemon -K -p"$JETTY_PID" -d"$JETTY_HOME" -a "$JAVA" -s HUP 

     TIMEOUT=30 
     while running "$JETTY_PID"; do 
     if ((TIMEOUT-- == 0)); then 
+   for child_pid in `ps -o pid --no-headers --ppid $JETTY_PID_NO` 
+   do 
+   kill -KILL $child_pid 
+   done 
      start-stop-daemon -K -p"$JETTY_PID" -d"$JETTY_HOME" -a "$JAVA" -s KILL 
     fi