Java进程在使用Kill或pkill异常终止时,unix命令不会删除临时文件



当用Java开发的工具启动时,它会在文件夹中创建临时文件。如果终止正确,这些文件将被删除,但如果使用kill或pkill命令终止,这些文件不会被删除。是否有任何方法可以向java进程发送信号,在终止进程之前删除这些文件?请帮我解决这个问题。提前感谢

当涉及到进程终止时,File.deleteOnExit()似乎很脆弱。相比之下,将NIO API与StandardOpenOption.DELETE_ON_CLOSE一起使用似乎更可靠,尽管其规范仅规定:"如果未调用close方法,则当Java虚拟机终止时,将尽最大努力删除文件"

例如,当运行以下程序时:

File f1=File.createTempFile("deleteOnExit", ".tmp");
f1.deleteOnExit();
final Path f2 = Files.createTempFile("deleteOnClose", ".tmp");
FileChannel ch = FileChannel.open(f2, StandardOpenOption.DELETE_ON_CLOSE);
System.out.println(f1);
System.out.println(f2);
LockSupport.parkNanos(Long.MAX_VALUE);
// the following statement is never reached, but it’s here to avoid
// early cleanup of the channel by garbage collector
ch.close();

并在进程挂起在parkNanos时终止进程,JVM在正确删除我机器上的deleteOnClose文件的同时保留deleteOnExit tmp文件。

您可以添加shutdown hook并明确地清除所有需要的内容。

Runtime.getRuntime().addShutdownHook(new Thread() {
    public void run() { 
        //put your shutdown code here 
    }
});

这实际上和java.io.File#deleteOnExit为您所做的是一样的。

最新更新