diff options
author | Sean Whitton <spwhitton@spwhitton.name> | 2015-02-05 18:13:38 +0900 |
---|---|---|
committer | Sean Whitton <spwhitton@spwhitton.name> | 2015-02-05 18:13:38 +0900 |
commit | 0bf5a4989ce0b319d582c0ea839b1a358254ed0e (patch) | |
tree | d3c30e1b3c52aff5d5d2121660e813025b3dab93 /bin/chronic | |
parent | 345e1e7c4bb63aa620303c15a712ebb6ee1ed429 (diff) | |
download | dotfiles-0bf5a4989ce0b319d582c0ea839b1a358254ed0e.tar.gz |
chronic from joeyh's moreutils package
Diffstat (limited to 'bin/chronic')
-rwxr-xr-x | bin/chronic | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/bin/chronic b/bin/chronic new file mode 100755 index 00000000..f70091a7 --- /dev/null +++ b/bin/chronic @@ -0,0 +1,63 @@ +#!/usr/bin/perl + +=head1 NAME + +chronic - runs a command quietly unless it fails + +=head1 SYNOPSIS + +chronic COMMAND... + +=head1 DESCRIPTION + +chronic runs a command, and arranges for its standard out and standard +error to only be displayed if the command fails (exits nonzero or crashes). +If the command succeeds, any extraneous output will be hidden. + +A common use for chronic is for running a cron job. Rather than +trying to keep the command quiet, and having to deal with mails containing +accidental output when it succeeds, and not verbose enough output when it +fails, you can just run it verbosely always, and use chronic to hide +the successful output. + + 0 1 * * * chronic backup # instead of backup >/dev/null 2>&1 + +=head1 AUTHOR + +Copyright 2010 by Joey Hess <id@joeyh.name> + +Original concept and "chronic" name by Chuck Houpt. + +Licensed under the GNU GPL version 2 or higher. + +=cut + +use warnings; +use strict; +use IPC::Run qw( start pump finish timeout ); + +if (! @ARGV) { + die "usage: chronic COMMAND...\n"; +} + +my ($out, $err); +my $h = IPC::Run::start \@ARGV, \*STDIN, \$out, \$err; +$h->finish; +my $ret=$h->full_result; + +if ($ret >> 8) { # child failed + showout(); + exit ($ret >> 8); +} +elsif ($ret != 0) { # child killed by signal + showout(); + exit 1; +} +else { + exit 0; +} + +sub showout { + print STDOUT $out; + print STDERR $err; +} |