从 Java 代码中,我按照以下方式调用我的脚本文件,
Process process =Runtime.getRuntime().exec("sh /usr/local/garner/garnerd start");
int status = process.waitFor();
garnerd脚本代码如下(依次调用garner.sh):
function start()
{
sh /usr/local/garner/garner.sh > /usr/local/garner/log/garner.log &
echo "Garner is started"
}
case "$1" in
start)
start
;;
*)
echo "Usage: garnerd {start|stop|restart|status|reconfig}"
exit 1
esac
exit $retval
Garner shell脚本(garner.sh)来源是:
/usr/local/garner/garnerd status
if [ $? -eq 0 ]; then
echo "`date` $0 :Garner is allready running"
exit 0
fi
touch /dev/blank
cd /usr/local/garner
uname -a | grep -i cygwin
if [ $? -eq 0 ]
then
export CYGWIN="$CYGWIN error_start=dumper -d %1 %2"
/usr/local/garner/garner.exe -n -c /usr/local/garner/conf/garner.conf -p /usr/local/garner/garner.pid -l /usr/local/garner/log/garner.log -L 4 &
else
/usr/local/garner/garner -c /usr/local/garner/conf/garner.conf -p /usr/local/garner/garner.pid -l /usr/local/garner/log/garner.log -L 4 &
fi
cd -
当我调用./garnerd start时,它会创建pid文件。之后,如果我看到该文件的内容,它会显示garner的进程ID。
[root@localhost garner]# cat garner.pid
9282
但是当我通过以下命令检查进程ID的详细信息时,它显示使用信号3的“SigBlk:0000000000000004”。
[root@localhost garner]# cat /proc/9282/status
Name: garner
State: S (sleeping)
SleepAVG: 78%
Tgid: 9282
Pid: 9282
PPid: 9281
TracerPid: 0
Uid: 0 0 0 0
Gid: 0 0 0 0
FDSize: 64
Groups: 0 1 2 3 4 6 10
VmPeak: 58888 kB
VmSize: 58884 kB
VmLck: 0 kB
VmHWM: 7124 kB
VmRSS: 7124 kB
VmData: 17192 kB
VmStk: 88 kB
VmExe: 84 kB
VmLib: 4480 kB
VmPTE: 156 kB
StaBrk: 05af0000 kB
Brk: 060ec000 kB
StaStk: 7fff0329d950 kB
Threads: 2
SigQ: 0/47721
SigPnd: 0000000000000000
ShdPnd: 0000000000000000
SigBlk: 0000000000000004
SigIgn: 0000000000001002
SigCgt: 0400000180006005
CapInh: 0000000000000000
CapPrm: 00000000fffffeff
CapEff: 00000000fffffeff
Cpus_allowed: 00000000,00000000,00000000,00000000,00000000,00000000,00000000,00ffffff
Mems_allowed: 00000000,00000003
如果我从 Linux 机器手动运行命令(./garnerd start),它会显示“SigBlk:0000000000000000”。 这意味着 Java 阻止了进程?如果是,那么为什么以及在什么情况下??
最佳答案
来自API doc java.lang.Process
:
Because some native platforms only provide limited buffer size for standard input and output streams, failure to promptly write the input stream or read the output stream of the subprocess may cause the subprocess to block, or even deadlock.
This article详细解释了问题并提出了解决方案。
关于java - Java 是否会阻止由runtime.exec 创建的进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24676300/