java - 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):

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/

相关文章:

java - Thread[main,5,main] 和 Thread[Thread-77416,5,main] 有什么区别

java - 从 Java 执行 Hive 查询

java - 在 linux 中使用 ProcessBuilder 执行 shell 命令

java - 无法找到正确的 rsync 参数来传递给 Java 运行时 exec 以忽略文件夹

java - 使用 Jython 打开特定浏览器

java - Android 中的 Activity 之间无法传递值

java - 在Java中,为什么会收到错误消息,提示我是否需要其他?

java - 如何在Android Vision API中设置全屏?

java - 如何使用 Java 运行时使用 "cd"命令?

Java Runtime.getRuntime().exec() 在调用数百次后失败