击子是越来越重复
问题描述:
我面对一个行为,其中即在后台bash的子进程运行(parentesis和&之间)代码正在有时,显然,叫了两声:击子是越来越重复
是这样的话:
# script start.sh
#!/bin/bash
echo "Starting ..."
(
java -server ...
ret=$?
log "Process has stopped returning: [$ret]"
exit $ret
) &
在正常情况下,在运行start.sh脚本,两个处理将被创建,一个用于start.sh本身和其他的背景的bash子(java程序):
#> ps -ef | grep ^user
user 24538 1 0 Oct22 ? 00:00:00 /bin/bash start.sh
user 24539 24538 2 Oct22 ? 06:20:56 java -server ...
但是,几天后一个新的Java程序,即24539个进程(Java)的儿童,正在形成:
#> ps -ef | grep ^user
user 24538 1 0 Oct22 ? 00:00:00 /bin/bash start.sh
user 24539 24538 18 Oct22 ? 06:20:56 java -server ...
user 25888 24539 2 Oct25 ? 00:00:00 java -server ...
没有人有任何想法,为什么/它是如何发生的?
答
这与壳无关;如果涉及bash
,新Java进程的父进程id将是24538,而不是24539.Java进程本身是分叉的。您必须查看代码才能看到原因。
是Chepner,这是我的第一个想法,但是这个Java代码并没有做任何事情可以分叉自己。它只运行一个OSGI lib代码(没有任何线程),阻塞直到start.sh被杀死或OSGI收到一个“退出”命令,然后java进程“优雅地”完成,并且后台bash子进程也被阻塞。 – RLM 2014-11-03 14:13:09
您可以尝试使用'strace'运行Java进程来查看它调用fork的位置。 – chepner 2014-11-03 14:26:31
现在我无法运行strace,导致进程被冻结,即使我重新启动它,我们也不知道什么时候会发生。不过谢谢你的建议。 – RLM 2014-11-03 18:43:18