2015-09-24 95 views
0

爲方便起見,我把我的服務器命令放入一個函數中,但是我後臺獲得一個pid的函數不是我的服務器的pid。在Bash中,殺死後臺函數不會殺死內部進程,爲什麼他們有不同的pid?

myserver(){ 
# May contain complicate parameter 
sleep 10 
} 
myserver > my.log & 
pid=$! 
ps aux|grep sleep 
echo "Found PID " $pid is different from ps 

所以,如果我kill $pid不會殺了真正的服務器進程(這裏就是睡覺)。什麼,應該怎麼辦?

UPDATE

sleep 10 & 
pid=$! 
ps aux|grep sleep 
echo Found PID $pid is same 

UPDATE

在這種情況下

myserver(){ 
# May contain complicate parameter 
sleep 10 
} 
myserver > my.log & 
kill $! 

將殺死睡眠過程,但實際上,我的服務器是java -jar,當我做kill $!, java進程不會被殺死。

回答

0

爲了通過kill命令殺死你應該提供PID而不是Job ID。

檢查this post about JID and PID

更新簡評:

是U SRE你是對提供呢?

在我的系統:

$ sleep 20 & 
[2] 10080 
$ kill -9 $! 
[2]- Killed     sleep 20 
$ 

便接踵而來了

好吧,現在我明白了。對不起,我誤解了你的問題。你所描述的是預期的行爲:

$!擴展爲從當前shell執行的最新後臺命令(參見列表)的十進制進程ID。 (例如,從子shell執行的後臺命令不會影響當前shell環境中「$!」的值)。對於管道,進程ID是管道中最後一個命令的進程ID。

因此,在這種情況下,也許嘗試對問題this proposed solution

更新:

好,在Java理線的情況下,我會嘗試一個正則表達式:

pkill -f 'java.*<your process name or some -classpath jar or something unique to the process you want to kill>' 

事實上,任何與此命令一起出現的字符串或類路徑jar都會導致匹配,從而完成這項工作。

+0

[這裏](http://tldp.org/LDP/abs/html/internalvariables.html)表示,'$!'是最後一個命令PID。 – wener

+0

但是如果你把命令放到了函數和後臺函數中,那麼pid不是內部進程的pid。 – wener

+0

有一點不同,我更新了我的問題。我可以理解他們爲什麼得到不同的pid,因爲函數是在子shell中運行的,內部進程是另一個進程。 – wener