Index: /branches/release-38/tools/run-periodic-tasks
===================================================================
--- /branches/release-38/tools/run-periodic-tasks (revision 2272)
+++ /branches/release-38/tools/run-periodic-tasks (revision 2337)
@@ -1,3 +1,3 @@
-#!/usr/bin/perl -w
+#!/opt/local/bin/perl -w
 
 # Movable Type (r) Open Source (C) 2001-2008 Six Apart, Ltd.
@@ -10,6 +10,38 @@
 
 use lib 'lib', '../lib';
-use MT::Bootstrap;
-use MT;
+
+my $daemonize = 0;
+my $sleep     = 5;
+my $help      = 0;
+my $load      = 10;
+my $verbose   = 0;
+my $scoreboard;
+my $randomize_jobs = 0;
+my $trace_objects = 0;
+
+require Getopt::Long;
+Getopt::Long::GetOptions(
+    "daemon"       => \$daemonize,
+    "sleep=i"      => \$sleep,
+    "load=i"       => \$load,
+    "scoreboard=s" => \$scoreboard,
+    "randomly"     => \$randomize_jobs,
+    "verbose"      => \$verbose,
+    "leak"         => \$trace_objects,
+);
+
+if ( $trace_objects ) {
+    require Devel::Leak::Object;
+    Devel::Leak::Object->import( qw{ GLOBAL_bless } );
+}
+
+my %cfg;
+$cfg{verbose} = $verbose;
+$cfg{scoreboard} = $scoreboard;
+$cfg{prioritize} = 1;
+$cfg{randomize} = $randomize_jobs;
+
+require MT::Bootstrap;
+require MT;
 
 my $mt = MT->new() or die MT->errstr;
@@ -21,28 +53,4 @@
 $mt->{plugin_template_path} = 'tmpl';
 $mt->run_callbacks('init_app', $mt);
-
-require Getopt::Long;
-my $daemonize = 0;
-my $sleep     = 5;
-my $help      = 0;
-my $load      = 10;
-my $verbose   = 0;
-my $scoreboard;
-my $randomize_jobs = 0;
-
-Getopt::Long::GetOptions(
-    "daemon"       => \$daemonize,
-    "sleep=i"      => \$sleep,
-    "load=i"       => \$load,
-    "scoreboard=s" => \$scoreboard,
-    "randomly"     => \$randomize_jobs,
-    "verbose"      => \$verbose,
-);
-
-my %cfg;
-$cfg{verbose} = $verbose;
-$cfg{scoreboard} = $scoreboard;
-$cfg{prioritize} = 1;
-$cfg{randomize} = $randomize_jobs;
 
 my $client = eval {
Index: /branches/release-38/lib/MT/TheSchwartz.pm
===================================================================
--- /branches/release-38/lib/MT/TheSchwartz.pm (revision 2336)
+++ /branches/release-38/lib/MT/TheSchwartz.pm (revision 2337)
@@ -30,4 +30,13 @@
     my $class = shift;
     $class->instance->SUPER::insert(@_);
+}
+
+sub default_logger {
+    my ($msg, $job) = @_;
+    # suppress TheSchwartz::Job's 'job completed'
+    return if $msg eq 'job completed';
+
+    $msg =~ s/\s+$//;
+    print STDERR "$msg\n";
 }
 
@@ -41,4 +50,7 @@
     # Reports object usage inbetween jobs if Devel::Leak::Object is loaded
     $OBJECT_REPORT = 1 if $Devel::Leak::Object::VERSION;
+
+    $param{verbose} = \&default_logger
+        if $param{verbose} && (ref $param{verbose} ne 'CODE');
 
     my $client = $class->SUPER::new(%param);
@@ -134,10 +146,16 @@
     my $did_work = 0;
 
+    # holds state of objects at start
+    my %obj_start;
     if ($OBJECT_REPORT) {
-        Devel::Leak::Object::status();
-        print "\n\n";
+        %obj_start = %Devel::Leak::Object::OBJECT_COUNT;
     }
 
     while (1) {
+        my %obj_pre;
+        if ($OBJECT_REPORT) {
+            %obj_pre = %Devel::Leak::Object::OBJECT_COUNT;
+        }
+
         if ($client->work_once) {
             $did_work = 1;
@@ -157,10 +175,33 @@
             $did_work = 0;
             if ($OBJECT_REPORT) {
-                Devel::Leak::Object::status();
-                print "\n\n";
+                leak_report(\%obj_start, \%obj_pre, \%Devel::Leak::Object::OBJECT_COUNT);
             }
         }
 
         sleep $delay;
+    }
+}
+
+our %persistent;
+BEGIN {
+    %persistent = map { $_ => 1 } qw( MT::Task MT::Plugin MT::Component MT::ArchiveType MT::TaskMgr MT::WeblogPublisher MT::Serializer TheSchwartz::Job TheSchwartz::JobHandle );
+}
+sub leak_report {
+    my ($start, $pre, $post) = @_;
+    my $reported;
+    foreach my $class (sort keys %$post) {
+        # skip reporting classes that are persistent in nature
+        next if exists $persistent{$class};
+
+        my $post_count = $post->{$class};
+        next if ! $post_count;
+        my $pre_count = $pre->{$class} || 0;
+        my $start_count = $start->{$class} || 0;
+        next if $post_count == 1;  # ignores most singletons
+        if (($pre_count != $post_count) || ($post_count != $start_count)) {
+            print "Leak report (class, total, delta from last job(s), delta since process start):\n" unless $reported;
+            printf "%-40s %-10d %-10d %-10d\n", $class, $post_count, $post_count - $pre_count, $post_count - $start_count;
+            $reported = 1;
+        }
     }
 }
Index: /branches/release-38/lib/MT/Worker/Publish.pm
===================================================================
--- /branches/release-38/lib/MT/Worker/Publish.pm (revision 2332)
+++ /branches/release-38/lib/MT/Worker/Publish.pm (revision 2337)
@@ -59,5 +59,4 @@
 
         my $priority = $job->priority ? ", priority " . $job->priority : "";
-        $job->debug("MT::Worker::Publish publishing " . $fi->file_path . "$priority");
 
         # Important: prevents requeuing!
@@ -82,6 +81,6 @@
         }
 
-        ## MT::TheSchwartz->debug("Publishing: " . RebuildQueue::Daemon::_summary($fi));
-        MT::TheSchwartz->debug("Publishing file " . $fi->file_path . "...");
+        $job->debug("Publishing " . $fi->file_path . $priority);
+
         my $res = $mt->publisher->rebuild_from_fileinfo($fi);
         if (defined $res) {
@@ -96,14 +95,4 @@
                 $job->completed();
             }
-            # This is way too noisy and clutters the activity log
-            # for active sites.
-            # $mt->log({
-            #     ($fi->blog_id ? ( blog_id => $fi->blog_id ) : () ),
-            #     message => $mt->translate('Background Publishing Done'),
-            #     metadata => log_time() . ' '
-            #         . $mt->translate('Published: [_1]', $fi->file_path),
-            #     category => "publish",
-            #     level => MT::Log::INFO(),
-            # });
             $rebuilt++;
         } else {
