Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Catching Ctrl+C in Java

Is it possible to catch the Ctrl+C signal in a java command-line application? I'd like to clean up some resources before terminating the program.

like image 250
Pierre Avatar asked Oct 23 '09 07:10

Pierre


People also ask

How do I use Ctrl C in Java?

The program exits normally, when the last non-daemon thread exits or when the exit (equivalently, System. exit) method is invoked, or. The virtual machine is terminated in response to a user interrupt, such as typing Ctrl + C , or a system-wide event, such as user logoff or system shutdown.


2 Answers

You can attach a shutdown hook to the VM which gets run whenever the VM shuts down:

The Java virtual machine shuts down in response to two kinds of events:

  • The program exits normally, when the last non-daemon thread exits or when the exit (equivalently, System.exit) method is invoked, or

  • The virtual machine is terminated in response to a user interrupt, such as typing Ctrl+C, or a system-wide event, such as user logoff or system shutdown.

The thread you pass as shutdown hook has to follow several rules, though, so read the linked documentation carefully to avoid any problems. This includes ensuring thread-safety, quick termination of the thread, etc.

Also, as commenter Jesper points out, shutdown hooks are guaranteed to run on normal shutdown of the VM but if the VM process is terminated forcibly they don't. This can happen if native code screws up or if you forcibly kill the process (kill -9, taskkill /f).

But in those scenarios all bets are off anyway, so I wouldn't waste too much thought on it.

like image 159
Joey Avatar answered Oct 02 '22 12:10

Joey


Just for quick console testing purposes...

Runtime.getRuntime().addShutdownHook(new Thread() {         public void run() {             try {                 Thread.sleep(200);                 System.out.println("Shutting down ...");                 //some cleaning up code...              } catch (InterruptedException e) {                 Thread.currentThread().interrupt();                 e.printStackTrace();             }         }     }); 
like image 32
bkomac Avatar answered Oct 02 '22 14:10

bkomac