为方便起见,我把我的服务器命令放入一个函数中,但是我后台获得一个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