2014-11-03 75 views
1

我面對一個行爲,其中即在後臺bash的子進程運行(parentesis和&之間)代碼正在有時,顯然,叫了兩聲:擊子是越來越重複

是這樣的話:

# script start.sh 
#!/bin/bash 

echo "Starting ..." 

(
    java -server ... 

    ret=$? 
    log "Process has stopped returning: [$ret]" 
    exit $ret 
) & 

在正常情況下,在運行start.sh腳本,兩個處理將被創建,一個用於start.sh本身和其他的背景的bash子(java程序):

#> ps -ef | grep ^user 
user 24538  1 0 Oct22 ?  00:00:00 /bin/bash start.sh 
user 24539 24538 2 Oct22 ?  06:20:56 java -server ... 

但是,幾天後一個新的Java程序,即24539個進程(Java)的兒童,正在形成:

#> ps -ef | grep ^user 
user 24538  1 0 Oct22 ?  00:00:00 /bin/bash start.sh 
user 24539 24538 18 Oct22 ?  06:20:56 java -server ... 
user 25888 24539 2 Oct25 ?  00:00:00 java -server ... 

沒有人有任何想法,爲什麼/它是如何發生的?

回答

2

這與殼無關;如果涉及bash,新Java進程的父進程id將是24538,而不是24539.Java進程本身是分叉的。您必須查看代碼才能看到原因。

+0

是Chepner,這是我的第一個想法,但是這個Java代碼並沒有做任何事情可以分叉自己。它只運行一個OSGI lib代碼(沒有任何線程),阻塞直到start.sh被殺死或OSGI收到一個「退出」命令,然後java進程「優雅地」完成,並且後臺bash子進程也被阻塞。 – RLM 2014-11-03 14:13:09

+1

您可以嘗試使用'strace'運行Java進程來查看它調用fork的位置。 – chepner 2014-11-03 14:26:31

+0

現在我無法運行strace,導致進程被凍結,即使我重新啓動它,我們也不知道什麼時候會發生。不過謝謝你的建議。 – RLM 2014-11-03 18:43:18