为方便起见,我把我的服务器命令放到了一个函数中,但是后台函数得到了一个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进程不会被杀死。
答案 0 :(得分:0)
为了通过kill命令终止你应该提供PID而不是Job Id。
评论更新:
你正在提供它吗?在我的系统中:
$ 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都可以完成这项工作。