Процесс Java при аварийном завершении с помощью команд Unix Kill или pkill не удаляет временные файлы

Когда инструмент, разработанный на Java, запускается, он создает временные файлы в папке. При правильном завершении эти файлы удаляются, но при завершении с помощью команд kill или pkill эти файлы не удаляются. Есть ли способ отправить сигнал процессу java для удаления этих файлов перед завершением процесса? Пожалуйста, помогите мне решить эту проблему. Заранее спасибо


person JavaProgrammer    schedule 05.11.2014    source источник
comment
kill -15? Сигнал завершения. Это стандартный и самый безопасный способ завершить процесс. Не знаю, работает ли он...   -  person MadProgrammer    schedule 05.11.2014
comment
Этот вопрос лучше подходит для привилегированного пользователя.   -  person dic19    schedule 05.11.2014


Ответы (2)


Вы можете добавить хук выключения и явно очистить все, что вам нужно.

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

На самом деле это то же самое, что java.io.File#deleteOnExit делает для вас.

person avarabyeu    schedule 05.11.2014
comment
Если это то же самое, что делает deleteOnExit, как он должен решить проблему? - person Holger; 05.11.2014

Кажется, что 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 оставляет файл deleteOnExit tmp, правильно удаляя файл deleteOnClose на моей машине.

person Holger    schedule 05.11.2014