【问题标题】:Does Java Blocks processes created by runtime.exec?是否 Java Blocks 进程由 runtime.exec 创建?
【发布时间】:2014-07-10 12:14:20
【问题描述】:

从 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 的详细信息时,它显示 "SigBlk: 0000000000000004" 使用信号 3。

[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阻塞了进程?如果是,那么为什么以及在什么情况下??

【问题讨论】:

  • 您可以使用 apache commons exec 从 java 运行命令。它具有处理 I/P、O/P 流的方法,可防止缓冲区填充和阻塞进程。

标签: java runtime.exec


【解决方案1】:

来自java.lang.ProcessAPI doc

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

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

【讨论】:

  • 感谢您的回复,但我仍然不清楚您的答案.. :) ..请帮助解决这个问题。
  • @Michael.. 我已经阅读并尝试了文章中给出的示例(即 4.3,4.4)..但我仍然面临同样的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-24
  • 1970-01-01
  • 1970-01-01
  • 2010-10-03
  • 1970-01-01
  • 2015-06-21
  • 1970-01-01
相关资源
最近更新 更多