Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java是否会阻止runtime.exec创建的进程?_Java_Runtime.exec - Fatal编程技术网

Java是否会阻止runtime.exec创建的进程?

Java是否会阻止runtime.exec创建的进程?,java,runtime.exec,Java,Runtime.exec,从Java代码中,我按照以下方式调用脚本文件: Process process =Runtime.getRuntime().exec("sh /usr/local/garner/garnerd start"); int status = process.waitFor(); garnerd脚本代码如下所示(依次调用garner.sh): Garner shell脚本(Garner.sh)源代码为: /usr/local/garner/garnerd status if [ $? -eq 0

从Java代码中,我按照以下方式调用脚本文件:

Process  process =Runtime.getRuntime().exec("sh /usr/local/garner/garnerd start");
int status = process.waitFor();
garnerd脚本代码如下所示(依次调用garner.sh):

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 -
当我调用./garner 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机器上手动运行命令(./garnerdstart),它会显示“SigBlk:0000000000000000”。 这意味着Java会阻止进程?如果是,那么为什么以及在什么情况下??

来自
java.lang.Process

因为某些本机平台仅为提供有限的缓冲区大小 标准输入和输出流,未能及时写入输入 流或读取子流程的输出流可能会导致 子进程阻塞,甚至死锁


详细解释该问题并提出解决方案。

您可以使用apache commons exec从java运行命令。它有处理I/P、O/P流的方法,这些方法会阻止缓冲区填充和阻塞进程。谢谢你的回复,但我仍然不清楚你的答案。。请帮我解决这个问题。@Michael。。我已经阅读并尝试了文章中给出的例子(即4.3,4.4)…但我仍然面临同样的问题。
[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