背景
我有一个简单的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.sh
和MsgReader.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
答案 0 :(得分:2)
您没有关闭制作人。来自KafkaProducer
的Javadoc(Producer
的实现):
生成器包含一个缓冲区空间池,用于保存尚未传输到服务器的记录,以及一个后台I / O线程,负责将这些记录转换为请求并将它们传输到集群。未能在使用后关闭生产者将泄漏这些资源。
后台线程仍在运行,并且会阻止进程结束,直到您关闭Producer
,最好是在finally
/ try
之后的catch
块中。此外,stdinReader.close();
也属于finally
。