#!perl
use 5.010;
use strict;
use warnings;
use Getopt::Long;
use Process::Govern;
our $VERSION = '0.13'; # VERSION
my @SAVE_ARGV = @ARGV;
my %opts = (
log_stderr_size => 10*1024*1024,
log_stderr_histories => 10,
log_stdout_size => 10*1024*1024,
log_stdout_histories => 10,
);
Getopt::Long::Configure("no_permute");
GetOptions(
"help|h|?" => \$opts{-help},
"version|v" => \$opts{-version},
"name|n=s" => \$opts{name},
"single-instance" => \$opts{single_instance},
"restart" => \$opts{restart},
"show-stderr!" => \$opts{show_stderr},
"log-stderr-dir=s" => \$opts{log_stderr_dir},
"log-stderr-size=i" => \$opts{log_stderr_size},
"log-stderr-histories=i" => \$opts{log_stderr_histories},
"log-stderr-period=s" => \$opts{log_stderr_period},
"show-stdout!" => \$opts{show_stdout},
"log-stdout-dir=s" => \$opts{log_stdout_dir},
"log-stdout-size=i" => \$opts{log_stdout_size},
"log-stdout-histories=i" => \$opts{log_stdout_histories},
"log-stdout-period=s" => \$opts{log_stdout_period},
"timeout=i" => \$opts{timeout},
"pid-dir=s" => \$opts{pid_dir},
"on-multiple-instance=s" => \$opts{on_multiple_instance},
"load-watch" => \$opts{load_watch},
"load-high=f" => sub { $opts{load_watch} = 1; $opts{load_high_limit} = $_[1] },
"load-low=f" => sub { $opts{load_watch} = 1; $opts{load_low_limit} = $_[1] },
"load-every=i" => sub { $opts{load_watch} = 1; $opts{load_check_every} = $_[1] },
"killfam" => sub { $opts{killfam} = 1 },
);
if ($opts{-version}) {
say "govproc version ", ($Process::Govern::VERSION // "?");
exit 0;
} elsif ($opts{-help} || !@ARGV) {
print <<_;
Run child process and govern its various aspects
Usage: govproc [OPTS] -- [COMMAND ...]
Options:
--name=S Set process name.
--single-instance Prevent running multiple instances simultaneously.
--restart Restart when child process dies/exits.
--noshow-stderr Hide stderr output (but you can still log it).
--log-stderr-dir=S Enable logging of stderr and set log directory.
--log-stderr-size=N Set log file size limit, in bytes, default 10MB.
--log-stderr-histories=N Set number of rotated log files to keep, default 10.
--log-stderr-period=S Enable periodic rotation (daily/monthly/yearly).
--noshow-stdout Hide stdout output (but you can still log it).
--log-stdout-dir=S Enable logging of stdout and set log directory.
--log-stdout-size=N Set log file size limit, in bytes, default 10MB.
--log-stdout-histories=N Set number of rotated log files to keep, default 10.
--log-stdout-period=S Enable periodic rotation (daily/monthly/yearly).
--timeout=N Set execution time limit, in seconds.
--pid-dir=S Directory to put PID file, if --single-instance set.
--on-multiple-instance=S Can be set to 'exit' to silently exit when another
instance is already running.
--load-watch Enable load watching (suspend when system load is
too high, resume when load returns to low).
--load-high=N Set load high limit (default: 1.25).
--load-low=N Set load low limit (default: 0.25).
--load-every=N Set load watch checking frequency, in seconds
(default: 10).
--killfam Use killfam instead of kill, to kill process family.
_
exit 0;
}
my %ga = (
command => \@ARGV,
name => $opts{name},
single_instance => $opts{single_instance},
restart => $opts{restart},
pid_dir => $opts{pid_dir},
timeout => $opts{timeout},
on_multiple_instance => $opts{on_multiple_instance},
);
$ga{show_stderr} = $opts{show_stderr};
if ($opts{log_stderr_dir}) {
$ga{log_stderr} = {
dir => $opts{log_stderr_dir},
size => $opts{log_stderr_size},
histories => $opts{log_stderr_histories},
period => $opts{log_stderr_period},
};
}
$ga{show_stdout} = $opts{show_stdout};
if ($opts{log_stdout_dir}) {
$ga{log_stdout} = {
dir => $opts{log_stdout_dir},
size => $opts{log_stdout_size},
histories => $opts{log_stdout_histories},
period => $opts{log_stdout_period},
};
}
if ($opts{load_watch}) {
$ga{load_watch} = 1;
$ga{load_high_limit} = $opts{load_high_limit};
$ga{load_low_limit} = $opts{load_low_limit};
$ga{load_check_every} = $opts{load_check_every};
}
if ($opts{killfam}) {
$ga{killfam} = 1;
}
# show nicer text in 'ps', instead of '/usr/bin/perl /usr/local/bin/govprov
# --opt CMD --cmdopt', show 'govproc --opt'
$0 = "govproc" . " " . join(" ", @SAVE_ARGV[0..(@SAVE_ARGV-@ARGV-1)]);
exit Process::Govern::govern_process(%ga);
1;
# ABSTRACT: Run child process and govern its various aspects
# PODNAME: govproc
__END__
=pod
=encoding UTF-8
=head1 NAME
govproc - Run child process and govern its various aspects
=head1 VERSION
This document describes version 0.13 of govproc (from Perl distribution Process-Govern), released on 2014-09-06.
=head1 SYNOPSIS
% govproc [opts] COMMAND ...
See C<govproc --help> for list of options.
=head1 DESCRIPTION
This script is a command-line interface for L<Process::Govern>.
=head1 SEE ALSO
L<Process::Govern>
=head1 HOMEPAGE
Please visit the project's homepage at L<https://metacpan.org/release/Process-Govern>.
=head1 SOURCE
Source repository is at L<https://github.com/sharyanto/perl-Process-Govern>.
=head1 BUGS
Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Process-Govern>
When submitting a bug or request, please include a test-file or a
patch to an existing test-file that illustrates the bug or desired
feature.
=head1 AUTHOR
perlancar <perlancar@cpan.org>
=head1 COPYRIGHT AND LICENSE
This software is copyright (c) 2014 by perlancar@cpan.org.
This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.
=cut