java process

两台服务器,其中一台正常,另外一台,总是进程卡死!实在找不到原因,求助!!!
服务器配置分别是:
异常的服务器:Linux vultr.guest 4.4.0-87-generic #110-Ubuntu SMP x86_64 GNU/Linux
java version "1.8.0_144" , tomcat8.5.23,Python 3.5.2
正常的服务器:Linux 2.6.32-042stab123.9 #1 SMP x86_64 GNU/Linux
tomcat8.5.15,Python 3.5.2

最关键的是:代码一模一样,java与tomcat版本几乎都一样(大版本号一致,小版本号不同),但是一个会经常进程假死,另外一个完全没有任何异常。可以从哪些方面分析呢?

代码片段如下:
以下代码片段,包含于一个循环语句中,根据DB中的某一个字段值来判断是否执行以下代码

//for循环里面
String[] args = {...};//args[0]是python3,args[1]是python文件名
ProcessBuilder processBuilder = new ProcessBuilder(args);
processBuilder.redirectErrorStream(true);
Process process = processBuilder.start();
StringBuilder result = new StringBuilder();
final BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
try {
                String line;
                while ((line = reader.readLine()) != null) {
                    result.append(line);                                        
                    logger.info(line);
                }
            } catch (IOException e) {
                logger.warn("failed to read output from process", e);
            } finally {
                IOUtils.closeQuietly(reader);
            }
process.waitFor();
process.destroy();//这里,process起的进程,并没有关闭
int exit = process.exitValue();
//后面其他逻辑
......
Thread.sleep(3000)

process.destroy();
这里,好像没起作用!!!
用java 调用 python 命令,通过python产生的文件来判断python是否正在运行。经常性的,python进程还在,但是就是没有文件产生。kill此python进程之后,才恢复运行。
OS是ubuntu16,java版本是
java version "1.8.0_144"
Java(TM) SE Runtime Environment (build 1.8.0_144-b01)
Java HotSpot(TM) 64-Bit Server VM (build 25.144-b01, mixed mode)

阅读 4.1k
3 个回答

昨天没看清楚你贴的代码,真是抱歉。

其实并不需要process.destroy()的,除非真的waitFor超时了。

另外,看下是否Python重新起了别的进程,你杀掉了它的父进程,子进程是无法控制的。

我也是瞎猜,如果没有帮助请见谅。

Chrome browser randomly hangs on start from chromedriver

原因很复杂,我采取的办法是:写一个脚本,定时去检测这些进程的状态,如果发现进程是卡死状态,那么则直接kill。结合crontab即可。这里涉及到的太复杂了,并且是服务器端,短时间内,这种方案目测是最好的。使用strace去跟踪,不到五六小时,服务器就会由于硬盘空间不足,导致无法跟踪了。还是很感谢几位大神,谢谢

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题