当我们运行 lsof 来捕获已删除的文件时,
我们看到以下内容:(示例)
lsof +L1
java 193699 yarn 1760r REG 8,16 719 0 93696130 /grid/sdb/hadoop/hdfs/data/current/PLP-428352611-43.21.3.46-1502127526112/current/path/nbt/dir37/blk_1186014689_112276769.meta (deleted)
尽管文件已被删除,PID仍在运行的原因是什么
lsof +L1 | awk '{print $2}' | sort | uniq
193699
有可能避免这种情况吗?
答案1
太长了,无法发表评论,因此添加作为答案:
这是一个让这些文件保持打开状态的 Java 应用程序,所以是的,这种情况是可以避免的通过使用正确的编程风格并使用对象ObjectOutputStream
:
//create a Serializable List
List lNucleotide = Arrays.asList(
"adenine", "cytosine", "guanine", "thymine", "sylicine"
);
//serialize the List
//note the use of abstract base class references
try{
//use buffering
OutputStream file = new FileOutputStream("lNucleotide.ser");
OutputStream buffer = new BufferedOutputStream(file);
ObjectOutput output = new ObjectOutputStream(buffer);
try{
output.writeObject(lNucleotide);
}
finally{
output.close();
}
}
catch(IOException ex){
logger.log(Level.SEVERE, "Cannot create Silicon life form.", ex);
}
通过在应用程序级别关闭文件,您就会避免这个问题。因此,这并不是 Unix 或 Linux 做错任何事情的结果,而是您的应用程序固有的。