Proc::Simple -- launch and control background processes |
Proc::Simple -- launch and control background processes
use Proc::Simple;
$myproc = Proc::Simple->new(); # Create a new process object
$myproc->start("shell-command-line"); # Launch an external program $myproc->start("command", # Launch an external program "param", ...); # with parameters
$myproc->start(sub { ... }); # Launch a perl subroutine $myproc->start(\&subroutine); # Launch a perl subroutine $myproc->start(\&subroutine, # Launch a perl subroutine $param, ...); # with parameters
$running = $myproc->poll(); # Poll Running Process
$proc->kill_on_destroy(1); # Set kill on destroy $proc->signal_on_destroy("KILL"); # Specify signal to be sent # on destroy
$myproc->kill(); # Kill Process (SIGTERM)
$myproc->kill("SIGUSR1"); # Send specified signal
$myproc->exit_status(); # Return exit status of process
Proc::Simple::debug($level); # Turn debug on
The Proc::Simple package provides objects mimicing real-life processes from a user's point of view. A new process object is created by
$myproc = Proc::Simple->new();
Either external programs or perl subroutines can be launched and controlled as processes in the background.
A 10-second sleep process, for example, can be launched as an external program as in
$myproc->start("/bin/sleep 10"); # or $myproc->start("/bin/sleep", "10");
or as a perl subroutine, as in
sub mysleep { sleep(shift); } # Define mysleep() $myproc->start(\&mysleep, 10); # Launch it.
or even as
$myproc->start(sub { sleep(10); });
The start Method returns immediately after starting the specified process in background, i.e. there's no blocking. It returns 1 if the process has been launched sucessfully and 0 if not.
The poll method checks if the process is still running
$running = $myproc->poll();
and returns 1 if it is, 0 if it's not. Finally,
$myproc->kill();
terminates the process by sending it the SIGTERM signal. As an option, another signal can be specified.
$myproc->kill("SIGUSR1");
sends the SIGUSR1 signal to the running process. kill returns 1 if it succeeds in sending the signal, 0 if it doesn't.
The methods are discussed in more detail in the next section.
A destructor is provided so that a signal can be sent to the forked processes automatically should the process object be destroyed or if the process exits. By default this behaviour is turned off (see the kill_on_destroy and signal_on_destroy methods).
The following methods are available:
$proc = new Proc::Simple;
or
$proc = Proc::Simple->new();
It takes no arguments.
start()
method can be used to launch both external programs
(like /bin/echo
) or one of your self-defined subroutines
(like foo()
) in a new process.
For an external program to be started, call
$status = $proc->start("program-name");
If you want to pass a couple of parameters to the launched program, there's two options: You can either pass them in one argument like in
$status = $proc->start("/bin/echo hello world");
or in several arguments like in
$status = $proc->start("/bin/echo", "hello", "world");
Just as in Perl's function system()
, there's a big difference
between the two methods: If you provide one argument containing
a blank-separated command line, your shell is going to
process any meta-characters (if you choose to use some) before
the process is actually launched:
$status = $proc->start("/bin/ls -l /etc/initt*");
will expand /etc/initt*
to /etc/inittab
before running the ls
command. If, on the other hand, you say
$status = $proc->start("/bin/ls", "-l", "*");
the *
will stay unexpanded, meaning you'll look for a file with the
literal name *
(which is unlikely to exist on your system unless
you deliberately create confusingly named files :). For
more info on this, look up perldoc -f exec
.
If, on the other hand, you want to start a Perl subroutine in the background, simply provide the function reference like
$status = $proc->start(\&your_function);
or supply an unnamed subroutine:
$status = $proc->start( sub { sleep(1) } );
You can also provide additional parameters to be passed to the function:
$status = $proc->start(\&printme, "hello", "world");
The start Method returns immediately after starting the specified process in background, i.e. non-blocking mode. It returns 1 if the process has been launched sucessfully and 0 if not.
$running = $myproc->poll();
and returns 1 if it is, 0 if it's not.
kill()
method:
$myproc->kill();
terminates the process by sending it the SIGTERM signal. As an option, another signal can be specified.
$myproc->kill("SIGUSR1");
sends the SIGUSR1 signal to the running process. kill returns 1 if it succeeds in sending the signal, 0 if it doesn't.
$current = $proc->kill_on_destroy; $proc->kill_on_destroy(1); # Set flag to true $proc->kill_on_destroy(0); # Set flag to false
$current = $proc->signal_on_destroy; $proc->signal_on_destroy("KILL");
# stdout to a file, left stderr unchanged $proc->redirect_output ("/tmp/someapp.stdout", undef);
# stderr to a file, left stdout unchanged $proc->redirect_output (undef, "/tmp/someapp.stderr");
# stdout and stderr to a separate file $proc->redirect_output ("/tmp/someapp.stdout", "/tmp/someapp.stderr");
Call this method before running the start method.
$pid = $proc->pid;
undef
is returned.
Please keep in mind that there is no guarantee that the SIGTERM signal really terminates a process. Processes can have signal handlers defined that avoid the shutdown. If in doubt, whether a process still exists, check it repeatedly with the poll routine after sending the signal.
I'd recommend using perl 5.6.0 although it might also run with 5.003 -- if you don't have it, this is the time to upgrade!
Michael Schilli <michael@perlmeister.com>
Contributors:
Tim Jenness <t.jenness@jach.hawaii.edu> did kill_on_destroy/signal_on_destroy/pid
Mark R. Southern <mark_southern@merck.com> worked on EXIT_STATUS tracking
Tobias Jahn <tjahn@users.sourceforge.net> added redirection to stdout/stderr
Clauss Strauch <Clauss_Strauch@aquila.fac.cs.cmu.edu> suggested the multi-arg start()-methods.
Proc::Simple -- launch and control background processes |