【问题标题】:Java process when terminated abnormally with Kill or pkill unix comamnds doesnot delete temporary files使用 Kill 或 pkill unix 命令异常终止的 Java 进程不会删除临时文件
【发布时间】:2014-11-05 10:09:36
【问题描述】:

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

【问题讨论】:

  • kill -15? “终止信号。这是杀死进程的默认和最安全的方法。” 不知道它是否有效......
  • 这个问题更适合Super User

标签: java kill-process


【解决方案1】:

在进程终止方面,File.deleteOnExit() 似乎很脆弱。相比之下,使用带有StandardOpenOption.DELETE_ON_CLOSE 的 NIO API 似乎更可靠,尽管它的规范只说:“如果没有调用 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 会留下deleteOnExit tmp 文件,同时正确删除我机器上的deleteOnClose 文件。

【讨论】:

    【解决方案2】:

    您可以添加关闭挂钩并明确清除您需要的所有内容。

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

    这实际上与java.io.File#deleteOnExit 为您所做的相同。

    【讨论】:

    • 如果和deleteOnExit一样,应该怎么解决呢?
    猜你喜欢
    • 2015-01-10
    • 1970-01-01
    • 2012-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多