即使在main中的最后一个语句之后,Java程序仍继续运行(在后台)

时间:2017-03-21 22:29:44

标签: java linux bash background-process

背景

我有一个简单的java程序,它从std输入中读取数据。我正在通过bash脚本executer.sh

执行它
python2 readLines.py | tee logfile |  java MsgReader

readLines.py逐行从文件中读取数据并将其抛出到stdout

MsgReader.java

import kafka.javaapi.producer.Producer;

public void process() {
    String msg = ""; 
    BufferedReader stdinReader = new BufferedReader(new InputStreamReader(System.in)

    Producer producer = new Producer();//it takes config file as parameter which is not related to the question here

    try {
         while ((msg = stdinReader.readLine()) != null) {
              producer.send(message);
         }   
         stdinReader.close();
     } catch (IOException|FailedToSendMessageException e) {
            System.out.println("Send message failed!");
            e.printStackTrace();
     }   
}   

public static void main(String args[]) throws JSONException,IOException {
    try{
        Date now = new Date();
        System.out.println("Start : " + now);
        process();// Continuously reads logs
        now = new Date();
        System.out.println("After : " + now);
    } catch(Exception e){ 
        e.printStackTrace();
        return;
    }   
}   

执行

./executer.sh &:在后台执行

问题

读完所有行readLines.py后,executer.shMsgReader.java将被ps命令验证执行。语句System.out.println("After : " + now); os记录在日志文件中,表示程序已到达main函数中的最后一个语句。

如何优雅地终止java程序和bash脚本。

我不想在这里添加System.exit()

平台

CentOS版本6.7(最终版)

java 1.7.0_95

python 2.7.6

1 个答案:

答案 0 :(得分:2)

您没有关闭制作人。来自KafkaProducer的Javadoc(Producer的实现):

  

生成器包含一个缓冲区空间池,用于保存尚未传输到服务器的记录,以及一个后台I / O线程,负责将这些记录转换为请求并将它们传输到集群。未能在使用后关闭生产者将泄漏这些资源。

后台线程仍在运行,并且会阻止进程结束,直到您关闭Producer,最好是在finally / try之后的catch块中。此外,stdinReader.close();也属于finally