| line | stmt | bran | cond | sub | pod | time | code | 
| 1 |  |  |  |  |  |  | package AnyEvent::Subprocess; | 
| 2 |  |  |  |  |  |  | BEGIN { | 
| 3 | 17 |  |  | 17 |  | 1163814 | $AnyEvent::Subprocess::VERSION = '1.102912'; | 
| 4 |  |  |  |  |  |  | } | 
| 5 |  |  |  |  |  |  | # ABSTRACT: flexible, OO, asynchronous process spawning and management | 
| 6 | 17 |  |  | 17 |  | 31901 | use Moose; | 
|  | 0 |  |  |  |  |  |  | 
|  | 0 |  |  |  |  |  |  | 
| 7 |  |  |  |  |  |  | with 'AnyEvent::Subprocess::Job'; | 
| 8 |  |  |  |  |  |  |  | 
| 9 |  |  |  |  |  |  | our $VERSION; | 
| 10 |  |  |  |  |  |  |  | 
| 11 |  |  |  |  |  |  | use AnyEvent::Subprocess::DefaultDelegates; | 
| 12 |  |  |  |  |  |  |  | 
| 13 |  |  |  |  |  |  | use namespace::autoclean; | 
| 14 |  |  |  |  |  |  |  | 
| 15 |  |  |  |  |  |  | __PACKAGE__->meta->make_immutable; | 
| 16 |  |  |  |  |  |  |  | 
| 17 |  |  |  |  |  |  | 1; | 
| 18 |  |  |  |  |  |  |  | 
| 19 |  |  |  |  |  |  |  | 
| 20 |  |  |  |  |  |  |  | 
| 21 |  |  |  |  |  |  | =pod | 
| 22 |  |  |  |  |  |  |  | 
| 23 |  |  |  |  |  |  | =head1 NAME | 
| 24 |  |  |  |  |  |  |  | 
| 25 |  |  |  |  |  |  | AnyEvent::Subprocess - flexible, OO, asynchronous process spawning and management | 
| 26 |  |  |  |  |  |  |  | 
| 27 |  |  |  |  |  |  | =head1 VERSION | 
| 28 |  |  |  |  |  |  |  | 
| 29 |  |  |  |  |  |  | version 1.102912 | 
| 30 |  |  |  |  |  |  |  | 
| 31 |  |  |  |  |  |  | =head1 SYNOPSIS | 
| 32 |  |  |  |  |  |  |  | 
| 33 |  |  |  |  |  |  | use AnyEvent::Subprocess; | 
| 34 |  |  |  |  |  |  |  | 
| 35 |  |  |  |  |  |  | # prepare the job | 
| 36 |  |  |  |  |  |  | my $job = AnyEvent::Subprocess->new( | 
| 37 |  |  |  |  |  |  | delegates     => ['StandardHandles'], | 
| 38 |  |  |  |  |  |  | on_completion => sub { die 'bad exit status' unless $_[0]->is_success }, | 
| 39 |  |  |  |  |  |  | code          => sub { | 
| 40 |  |  |  |  |  |  | my %args = %{$_[0]}; | 
| 41 |  |  |  |  |  |  | while(<>){ | 
| 42 |  |  |  |  |  |  | print "Got line: $_"; | 
| 43 |  |  |  |  |  |  | } | 
| 44 |  |  |  |  |  |  | exit 0; | 
| 45 |  |  |  |  |  |  | }, | 
| 46 |  |  |  |  |  |  | ); | 
| 47 |  |  |  |  |  |  |  | 
| 48 |  |  |  |  |  |  | # start the child | 
| 49 |  |  |  |  |  |  | my $run = $job->run; | 
| 50 |  |  |  |  |  |  |  | 
| 51 |  |  |  |  |  |  | # add watcher to print the next line we see on the child's stdout | 
| 52 |  |  |  |  |  |  | $run->delegate('stdout')->handle->push_read( line => sub { | 
| 53 |  |  |  |  |  |  | my ($h, $line) = @_; | 
| 54 |  |  |  |  |  |  | say "The child said: $line"; | 
| 55 |  |  |  |  |  |  | }); | 
| 56 |  |  |  |  |  |  |  | 
| 57 |  |  |  |  |  |  | # write to the child's stdin | 
| 58 |  |  |  |  |  |  | $run->delegate('stdin')->handle->push_write("Hello, world!\n"); | 
| 59 |  |  |  |  |  |  |  | 
| 60 |  |  |  |  |  |  | # close stdin after it has been written to the child | 
| 61 |  |  |  |  |  |  | $run->delegate('stdin')->handle->on_drain(sub { $_[0]->close_fh }); | 
| 62 |  |  |  |  |  |  |  | 
| 63 |  |  |  |  |  |  | # kill the child if it takes too long to produce a result | 
| 64 |  |  |  |  |  |  | my $killer = AnyEvent->timer( after => 42, interval => 0, cb => sub { | 
| 65 |  |  |  |  |  |  | $run->kill(2); # SIGINT. | 
| 66 |  |  |  |  |  |  | }); | 
| 67 |  |  |  |  |  |  |  | 
| 68 |  |  |  |  |  |  | # ensure the event loop runs until the on_completion handler dies | 
| 69 |  |  |  |  |  |  | EV::loop(); # you can use any AnyEvent-compatible event loop, including POE | 
| 70 |  |  |  |  |  |  |  | 
| 71 |  |  |  |  |  |  | # eventually prints "The child said: Got line: Hello, world!", or | 
| 72 |  |  |  |  |  |  | # perhaps dies if your system is really really overloaded. | 
| 73 |  |  |  |  |  |  |  | 
| 74 |  |  |  |  |  |  | =head1 DESCRIPTION | 
| 75 |  |  |  |  |  |  |  | 
| 76 |  |  |  |  |  |  | There are so many possible ways to use this module that a tutorial | 
| 77 |  |  |  |  |  |  | would take me months to write.  You should definitely read the test | 
| 78 |  |  |  |  |  |  | suite to see what possibilities exist.  (There is also an examples | 
| 79 |  |  |  |  |  |  | directory in the dist.) | 
| 80 |  |  |  |  |  |  |  | 
| 81 |  |  |  |  |  |  | The basic "flow" is like in the SYNOPSIS section; create a job, call | 
| 82 |  |  |  |  |  |  | run, wait for your callback to be called with the exit status of the | 
| 83 |  |  |  |  |  |  | subprocess. | 
| 84 |  |  |  |  |  |  |  | 
| 85 |  |  |  |  |  |  | The fun comes when you add delegates. | 
| 86 |  |  |  |  |  |  |  | 
| 87 |  |  |  |  |  |  | Delegates are technically instances of classes.  Typing: | 
| 88 |  |  |  |  |  |  |  | 
| 89 |  |  |  |  |  |  | my $stdin = AnyEvent::Subprocess::Job::Delegate::Handle->new( | 
| 90 |  |  |  |  |  |  | name      => 'stdin', | 
| 91 |  |  |  |  |  |  | direction => 'w', | 
| 92 |  |  |  |  |  |  | replace   => \*STDIN, | 
| 93 |  |  |  |  |  |  | ); | 
| 94 |  |  |  |  |  |  |  | 
| 95 |  |  |  |  |  |  | Every time you want to be able to write to STDIN is going to become | 
| 96 |  |  |  |  |  |  | tiring after a while.  When you load C<AnyEvent::Subprocess>, you also | 
| 97 |  |  |  |  |  |  | load | 
| 98 |  |  |  |  |  |  | L<AnyEvent::Subprocess::DefaultDelegate|AnyEvent::Subprocess::DefaultDelegates>. | 
| 99 |  |  |  |  |  |  | This registers short names for each delegate and will cause | 
| 100 |  |  |  |  |  |  | C<AnyEvent::Subprocess::Job> to build the actual instances | 
| 101 |  |  |  |  |  |  | automatically.  This means you can say C<'StandardHandles'> to get a | 
| 102 |  |  |  |  |  |  | delegate for each of STDIN, STDOUT, and STDERR.  If you want to know | 
| 103 |  |  |  |  |  |  | how all the sugary names work, just open C<DefaultDelegates.pm> and | 
| 104 |  |  |  |  |  |  | take a look.  (The documentation for that module also covers that, as | 
| 105 |  |  |  |  |  |  | well as how to define your own delegate builders.) | 
| 106 |  |  |  |  |  |  |  | 
| 107 |  |  |  |  |  |  | If you are too lazy to look -- there are delegates for giving the | 
| 108 |  |  |  |  |  |  | child arbitrary sockets or pipes opened to arbitrary file descriptors | 
| 109 |  |  |  |  |  |  | (so you can deal with more than stdin/stdout/stderr and communicate | 
| 110 |  |  |  |  |  |  | bidirectionally between the parent and child), there is a delegate for | 
| 111 |  |  |  |  |  |  | giving the child a pseudo-tty (which can run complicatged programs, | 
| 112 |  |  |  |  |  |  | like emacs!), there is a delegate for capturing any input | 
| 113 |  |  |  |  |  |  | automatically, and passing it back to the parent via the C<Done> | 
| 114 |  |  |  |  |  |  | object, and there is a delegate for calling functions in the parent | 
| 115 |  |  |  |  |  |  | when certain events are received. | 
| 116 |  |  |  |  |  |  |  | 
| 117 |  |  |  |  |  |  | Once you have decided what delegates your job needs, you need to | 
| 118 |  |  |  |  |  |  | create a job object: | 
| 119 |  |  |  |  |  |  |  | 
| 120 |  |  |  |  |  |  | my $proc = AnyEvent::Subprocess->new( | 
| 121 |  |  |  |  |  |  | delegates     => [qw/List them here/], | 
| 122 |  |  |  |  |  |  | code          => sub { code to run in the child }, | 
| 123 |  |  |  |  |  |  | on_completion => sub { code to run in the parent when the child is done }, | 
| 124 |  |  |  |  |  |  | ); | 
| 125 |  |  |  |  |  |  |  | 
| 126 |  |  |  |  |  |  | Then you can run it: | 
| 127 |  |  |  |  |  |  |  | 
| 128 |  |  |  |  |  |  | my $running = $proc->run; | 
| 129 |  |  |  |  |  |  | my $another = $proc->run({ with => 'args' }); # a separate process | 
| 130 |  |  |  |  |  |  |  | 
| 131 |  |  |  |  |  |  | The C<code> coderef receives a hashref as an argument; delegates | 
| 132 |  |  |  |  |  |  | typically populate this for you, but you can also pass a hashref of | 
| 133 |  |  |  |  |  |  | args to run (that will be merged with any arguments the delegates | 
| 134 |  |  |  |  |  |  | create; the delegates' arguments "win" if there is a conflict).  The | 
| 135 |  |  |  |  |  |  | code then runs in a child process until it stops running for some | 
| 136 |  |  |  |  |  |  | reason.  The C<on_completion> hook is then run in the parent, with the | 
| 137 |  |  |  |  |  |  | L<AnyEvent::Subprocess::Done|AnyEvent::Subprocess::Done> object passed | 
| 138 |  |  |  |  |  |  | in as an argument. | 
| 139 |  |  |  |  |  |  |  | 
| 140 |  |  |  |  |  |  | You can, of course, have as many children running concurrently as you | 
| 141 |  |  |  |  |  |  | desire.  The event loop handles managing the any IO with the child, | 
| 142 |  |  |  |  |  |  | and the notifications of the child dying.  (You don't need to deal | 
| 143 |  |  |  |  |  |  | with SIGCHLD or anything like that.) | 
| 144 |  |  |  |  |  |  |  | 
| 145 |  |  |  |  |  |  | =head1 OVERVIEW | 
| 146 |  |  |  |  |  |  |  | 
| 147 |  |  |  |  |  |  | C<AnyEvent::Subprocess> is a set of modules for running external | 
| 148 |  |  |  |  |  |  | processes, and interacting with them in the context of an event-driven | 
| 149 |  |  |  |  |  |  | program.  It is similar to L<POE::Wheel::Run|POE::Wheel::Run>, but | 
| 150 |  |  |  |  |  |  | much more customizable (and Moose-based).  It is also similar to | 
| 151 |  |  |  |  |  |  | modules that really want to be event-based, but aren't for some | 
| 152 |  |  |  |  |  |  | reason; this includes L<IPC::Run|IPC::Run> and | 
| 153 |  |  |  |  |  |  | L<IPC::Open3|IPC::Open3>, L<Expect|Expect>, and even the built-in | 
| 154 |  |  |  |  |  |  | C<qx//> operator.  You can replace all those modules with this one, | 
| 155 |  |  |  |  |  |  | and have the ability to write much more flexible applications and | 
| 156 |  |  |  |  |  |  | libraries. | 
| 157 |  |  |  |  |  |  |  | 
| 158 |  |  |  |  |  |  | AnyEvent::Subprocess is based on three classes; | 
| 159 |  |  |  |  |  |  | C<AnyEvent::Subprocess::Job>, which represents a job that can be run | 
| 160 |  |  |  |  |  |  | at a later time, C<AnyEvent::Subprocess::Running>, which represents a | 
| 161 |  |  |  |  |  |  | running child process, and C<AnyEvent::Subprocess::Done>, which | 
| 162 |  |  |  |  |  |  | represents a completed job.  The C<Job> object contains the command to | 
| 163 |  |  |  |  |  |  | run, information about its environment (which handles to capture, | 
| 164 |  |  |  |  |  |  | which plugins to run, what to do when the job is done, etc.).  Then | 
| 165 |  |  |  |  |  |  | C<Run> object is returned by C<< $job->run >>, and lets you interact | 
| 166 |  |  |  |  |  |  | with the running subprocess.  This includes things like writing to its | 
| 167 |  |  |  |  |  |  | pipes/sockets, reading from its pipes, sending it signals, and so on. | 
| 168 |  |  |  |  |  |  | When the running job exits, the C<on_completion> handler provided by | 
| 169 |  |  |  |  |  |  | the Job object is called with a C<Done> object.  This contains the | 
| 170 |  |  |  |  |  |  | exit status, output that the process produced (if requested), and so | 
| 171 |  |  |  |  |  |  | on. | 
| 172 |  |  |  |  |  |  |  | 
| 173 |  |  |  |  |  |  | What makes this more interesting is the ability to add delegates to | 
| 174 |  |  |  |  |  |  | any of these classes.  These delegates are called into at various | 
| 175 |  |  |  |  |  |  | points and allow you to add more features.  By default, you just get a | 
| 176 |  |  |  |  |  |  | callback when the process exits.  You can also kill the running | 
| 177 |  |  |  |  |  |  | process.  That's it.  From there, you can add delegates to add more | 
| 178 |  |  |  |  |  |  | features.  You can add a pipe to share between the parent and the | 
| 179 |  |  |  |  |  |  | child.  Instead of sharing a pipe, you can have an fd opened to an | 
| 180 |  |  |  |  |  |  | arbitrary file descriptor number in the child.  You have an infinite | 
| 181 |  |  |  |  |  |  | number of these, so you can capture the child's stdout and stderr, | 
| 182 |  |  |  |  |  |  | write to its stdin, and also share a socket for out-of-band | 
| 183 |  |  |  |  |  |  | communication.  You can also open a pipe to the child's fd #5 and | 
| 184 |  |  |  |  |  |  | write to it.  (This is nice if you are invoking something like C<gpg> | 
| 185 |  |  |  |  |  |  | that wants the password written on an arbitrary fd other than 1.) | 
| 186 |  |  |  |  |  |  |  | 
| 187 |  |  |  |  |  |  | (This is all done with the included C<Handle> delegate.  See | 
| 188 |  |  |  |  |  |  | L<AnyEvent::Subprocess::Job::Delegate::Handle>.) | 
| 189 |  |  |  |  |  |  |  | 
| 190 |  |  |  |  |  |  | You can then build upon this; instead of writing your own code to | 
| 191 |  |  |  |  |  |  | reading the handles when they become readable and accumulate input, | 
| 192 |  |  |  |  |  |  | you can write a delegate that saves all the data coming from a given | 
| 193 |  |  |  |  |  |  | handle and gives it to your program after the child exits (via the | 
| 194 |  |  |  |  |  |  | C<Done> instance). | 
| 195 |  |  |  |  |  |  |  | 
| 196 |  |  |  |  |  |  | (This is also included via the C<CaptureHandle> delegate.  See | 
| 197 |  |  |  |  |  |  | L<AnyEvent::Subprocess::Job::Delegate::CaptureHandle>.) | 
| 198 |  |  |  |  |  |  |  | 
| 199 |  |  |  |  |  |  | All of this integrates into your existing event-based app; waiting for | 
| 200 |  |  |  |  |  |  | IO from the child (or waiting for the child to exit) is asynchronous, | 
| 201 |  |  |  |  |  |  | and lets your app do other work while waiting for the child.  (It can | 
| 202 |  |  |  |  |  |  | integrate nicely into Coro, for example, unlike the default C<qx//>.) | 
| 203 |  |  |  |  |  |  |  | 
| 204 |  |  |  |  |  |  | =head1 BUGS | 
| 205 |  |  |  |  |  |  |  | 
| 206 |  |  |  |  |  |  | The parent's event loop still exists in the child process, which means | 
| 207 |  |  |  |  |  |  | you can't safely use it in the child.  I have tried to work around | 
| 208 |  |  |  |  |  |  | this in a few event loops; my C<AnyEventX::Cancel> module on github is | 
| 209 |  |  |  |  |  |  | an early attempt.  When that becomes stable, I will remove this | 
| 210 |  |  |  |  |  |  | restriction. | 
| 211 |  |  |  |  |  |  |  | 
| 212 |  |  |  |  |  |  | In the mean time, YOU MUST NOT USE ANY EVENT-LOOP FUNCTIONS IN THE | 
| 213 |  |  |  |  |  |  | CHILD. | 
| 214 |  |  |  |  |  |  |  | 
| 215 |  |  |  |  |  |  | This is not a problem if you are running external processes, but is a | 
| 216 |  |  |  |  |  |  | problem if you are running a code block and you want to do event-ful | 
| 217 |  |  |  |  |  |  | things in there.  (Note that EV is designed to allow the child to | 
| 218 |  |  |  |  |  |  | handle events that the parent created watchers for.  You can do that | 
| 219 |  |  |  |  |  |  | just fine.  It's if you want a fresh event loop with no existing | 
| 220 |  |  |  |  |  |  | watchers that doesn't work well yet.) | 
| 221 |  |  |  |  |  |  |  | 
| 222 |  |  |  |  |  |  | =head1 AUTHOR | 
| 223 |  |  |  |  |  |  |  | 
| 224 |  |  |  |  |  |  | Jonathan Rockway <jrockway@cpan.org> | 
| 225 |  |  |  |  |  |  |  | 
| 226 |  |  |  |  |  |  | =head1 COPYRIGHT AND LICENSE | 
| 227 |  |  |  |  |  |  |  | 
| 228 |  |  |  |  |  |  | This software is copyright (c) 2011 by Jonathan Rockway. | 
| 229 |  |  |  |  |  |  |  | 
| 230 |  |  |  |  |  |  | This is free software; you can redistribute it and/or modify it under | 
| 231 |  |  |  |  |  |  | the same terms as the Perl 5 programming language system itself. | 
| 232 |  |  |  |  |  |  |  | 
| 233 |  |  |  |  |  |  | =cut | 
| 234 |  |  |  |  |  |  |  | 
| 235 |  |  |  |  |  |  |  | 
| 236 |  |  |  |  |  |  | __END__ | 
| 237 |  |  |  |  |  |  |  |