爲方便起見,我把我的服務器命令放入一個函數中,但是我後臺獲得一個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進程不會被殺死。
[這裏](http://tldp.org/LDP/abs/html/internalvariables.html)表示,'$!'是最後一個命令PID。 – wener
但是如果你把命令放到了函數和後臺函數中,那麼pid不是內部進程的pid。 – wener
有一點不同,我更新了我的問題。我可以理解他們爲什麼得到不同的pid,因爲函數是在子shell中運行的,內部進程是另一個進程。 – wener