2015-09-24 74 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