X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=script%2Fpublic-inbox-watch;h=20534bf2a3ec196e36cdd3c9d2bb0c6136fba849;hb=62068fafcb40c2f91d31cf3fa5e775ecc52a6ba8;hp=a72180c90b74c89f35315196e237a632953671f0;hpb=5bde05b66f084c7c9dcf7389079aab6925aef328;p=public-inbox.git diff --git a/script/public-inbox-watch b/script/public-inbox-watch index a72180c9..20534bf2 100755 --- a/script/public-inbox-watch +++ b/script/public-inbox-watch @@ -1,10 +1,16 @@ #!/usr/bin/perl -w -# Copyright (C) 2016 all contributors +# Copyright (C) 2016-2020 all contributors # License: AGPL-3.0+ use strict; -use warnings; +use IO::Handle; use PublicInbox::WatchMaildir; use PublicInbox::Config; +use PublicInbox::DS; +use PublicInbox::Sigfd; +use PublicInbox::Syscall qw($SFD_NONBLOCK); +my $oldset = PublicInbox::Sigfd::block_signals(); +STDOUT->autoflush(1); +STDERR->autoflush(1); my ($config, $watch_md); my $reload = sub { $config = PublicInbox::Config->new; @@ -13,10 +19,27 @@ my $reload = sub { }; $reload->(); if ($watch_md) { - my $scan = sub { $watch_md->scan if $watch_md }; - $SIG{HUP} = $reload; - $SIG{USR1} = $scan; - $SIG{ALRM} = sub { $SIG{ALRM} = 'DEFAULT'; $scan->() }; - alarm(1); - $watch_md->watch while ($watch_md); + my $scan = sub { $watch_md->trigger_scan('full') if $watch_md }; + my $quit = sub { + $watch_md->quit if $watch_md; + $watch_md = undef; + }; + my $sig = { + HUP => $reload, + USR1 => $scan, + CHLD => \&PublicInbox::DS::enqueue_reap, + }; + $sig->{QUIT} = $sig->{TERM} = $sig->{INT} = $quit; + + # --no-scan is only intended for testing atm, undocumented. + unless (grep(/\A--no-scan\z/, @ARGV)) { + PublicInbox::DS::requeue($scan); + } + my $sigfd = PublicInbox::Sigfd->new($sig, $SFD_NONBLOCK); + local %SIG = (%SIG, %$sig) if !$sigfd; + if (!$sigfd) { + PublicInbox::Sigfd::set_sigmask($oldset); + PublicInbox::DS->SetLoopTimeout(1000); + } + $watch_md->watch($sig, $oldset) while ($watch_md); }