in reply to Window Close / Process Termination Handler on Windows

I don't have time currently to deeply troubleshoot (especially why END isn't working for you), but one sure-fire way to ensure DESTROY is called is wrap it with a dummy package, and then generate an unused object in your code. DESTROY is called when an object goes out of scope (in our case, the program finishes). This is quick and dirty, but it does do what I think you're after. Better would be to possibly rewrite the whole shebang to be Object Oriented.

use strict; use warnings; use FindBin; use File::Spec; my $log_fn = File::Spec->catfile($FindBin::Bin, "cleanup_handler_log.t +xt"); open my $LOG, '>>', $log_fn or die "Failed to open log '$log_fn' for a +ppending ($!)\n"; binmode $LOG; $LOG->autoflush(1); # disable buffering package Blah;{ sub new { return bless {}, shift; } sub DESTROY { print $LOG "DESTROY() called. Cleaning up...\r\n"; } } my $obj = Blah->new; my $sleep_time = 1; # 1d print "Sleeping $sleep_time seconds ...\n"; sleep $sleep_time; print "Print finishing normally (sleep $sleep_time completed)\n";

Replies are listed 'Best First'.
Re^2: Window Close / Process Termination Handler on Windows
by Aldebaran (Curate) on Aug 30, 2018 at 00:47 UTC

    I think I'm able to follow you:

    $ ./1.term.pl Sleeping 1 seconds ... Print finishing normally (sleep 1 completed) [1]+ Done gedit 1.term.pl $ ./1.term.pl Sleeping 1 seconds ... Print finishing normally (sleep 1 completed) $ ./1.term.pl Sleeping 3 seconds ... ^C $ cat cleanup_handler_log.txt DESTROY() called. Cleaning up... DESTROY() called. Cleaning up...

    Destroy gets called when the sleep amount expires. I raised the sleep number to 3 and hit it with control-c and did not get the destroy called. Why is that? Finally, I ran it in the terminal and x'ed out of it while it was running and did see the destroy message:

    $ cat cleanup_handler_log.txt DESTROY() called. Cleaning up... DESTROY() called. Cleaning up... DESTROY() called. Cleaning up... $

    Script I was running:

    $ cat 1.term.pl #!/usr/bin/perl -w use 5.011; use FindBin; use File::Spec; my $log_fn = File::Spec->catfile($FindBin::Bin, "cleanup_handler_log.t +xt"); open my $LOG, '>>', $log_fn or die "Failed to open log '$log_fn' for a +ppending ($!)\n"; binmode $LOG; $LOG->autoflush(1); # disable buffering package Blah;{ sub new { return bless {}, shift; } sub DESTROY { print $LOG "DESTROY() called. Cleaning up...\r\n"; } } my $obj = Blah->new; my $sleep_time = 3; print "Sleeping $sleep_time seconds ...\n"; sleep $sleep_time; print "Print finishing normally (sleep $sleep_time completed)\n"; $
Re^2: Window Close / Process Termination Handler on Windows
by rminner (Chaplain) on Aug 29, 2018 at 15:50 UTC
    Unfortunately, when closing the window with the [x] in the upper right corner, the DESTROY handler from your example is not being called in the environment listed above.