2009-08-04 7 views
7

Ich habe ein Java-Programm, das eine Sperrdatei erstellt, um sicherzustellen, dass keine anderen Ausführungen gleichzeitig ausgeführt werden. Wenn das Programm ausgeführt wird, erstellt es die Datei und beim Beenden entweder erfolgreich oder über eine Ausnahme wird die Datei entfernt. Wenn der Benutzer jedoch Strg + C drückt, das Terminal schließt oder die Ausführung auf andere Weise unterbricht, wird die Datei nicht gelöscht. Gibt es eine Möglichkeit, diesen Interrupt-Befehl zu erkennen und sicherzustellen, dass die Datei auch in diesem Fall gelöscht wird?Wie man Java mit Systeminterrupts umgehen lässt Wie Strg + C

+0

Ironischerweise vergaß ich diese Frage und [beantwortete] (https://stackoverflow.com/a/34188676/113632) eine verwandte sechs Jahre (und damit verbundenen realen Erfahrung) später. @Amber hat absolut recht, dass die meisten Java-Anwendungen Shutdown-Hooks verwenden sollten, aber um * SIGINT' und andere Signale zu verarbeiten, müssen Sie 'sun.misc.Signal' verwenden, wie in der verknüpften Frage beschrieben. – dimo414

Antwort

5

Vielleicht möchten Sie in shutdown hooks suchen. vor

Auch dies ist wahrscheinlich ein Duplikat oder nahezu Duplikat dieser früheren SO Frage von einem oder zwei Tagen:

How can I "intercept" Ctrl+C in a CLI application?

+0

Werden Shutdown-Hooks auch ausgeführt, wenn die JVM abnormal beendet wird? Ich würde es bezweifeln. –

+0

@ mmyers, das hängt von Ihrer Definition von abnormal ab. :) Ctrl-C löst sie generell aus. Das Schließen des Terminals ist in der Regel nicht möglich. – jsight

+1

Es gibt keine 100% idiotensichere Möglichkeit, solche Lockfiles zu löschen. Timestamping kann helfen, aber es kostet die Festplatte alle paar Sekunden zu schreiben. Viele Programme suchen beim Start einfach nach einer Sperrdatei und fordern den Benutzer dazu auf. – Amber

2

Die einzige gute Möglichkeit, um damit umzugehen ist Ihre Log-Datei zu , und aktualisieren Sie die Protokolldatei alle paar Sekunden mit einem neuen Zeitstempel. File.deleteOnExit wird helfen, aber keine Methode ist narrensicher (was passiert, wenn jemand nur das Netzkabel zieht?).

Wenn Sie einen Zeitstempel schreiben, können Sie nach einem gültigen Zeitstempel suchen (kürzlich geschrieben) und die Protokolldatei überschreiben, wenn sie zu veraltet ist. Auf diese Weise wird eine veraltete Sperrdatei dem Benutzer nicht in die Quere kommen.

Verwandte Themen