在Bash中,Kill后台函数不会杀死内部进程,为什么它们有不同的pid?

时间:2015-09-24 07:51:17

标签: linux bash

为方便起见,我把我的服务器命令放到了一个函数中,但是后台函数得到了一个pid不是我服务器的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不会杀死真正的服务器进程(这里是睡眠)。我该怎么办?

更新

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

更新

在这种情况下

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

会杀死睡眠过程,但实际上,我的服务器是java -jar,当我执行kill $!时,java进程不会被杀死。

1 个答案:

答案 0 :(得分:0)

为了通过kill命令终止你应该提供PID而不是Job Id。

检查this post about JID and PID

评论更新:

你正在提供它吗?

在我的系统中:

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

Folow up

好的,现在我明白了。对不起,我误解了你的问题。你所描述的是预期的行为:

  

$!扩展为从当前shell执行的最新后台命令(请参阅列表)的十进制进程ID。 (例如,从子shell执行的后台命令不会影响当前shell环境中" $!"的值。)对于管道,进程ID是管道中最后一个命令的进程ID。 / p>

因此,在这种情况下,可以尝试this proposed solution

问题更新:

好的,在java process的情况下,我会尝试使用regexp:

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

事实上,任何与此命令一起出现并导致匹配的字符串或类路径jar都可以完成这项工作。