in reply to Read a process output asynchronously

i've been playing with POE, how about this?

use strict; use warnings; use POE qw( Wheel::Run ); POE::Session->create( inline_states => { _start => \&_start, got_line => \&got_line, timeout => \&timeout, }, ); sub _start { my ( $kernel, $heap ) = @_[ KERNEL, HEAP ]; $heap->{wheel_run} = POE::Wheel::Run->new( Program => <<_SH_, /bin/sh -c 'for i in 1 2 3 4; do echo kick; sleep 4; done; sleep 600' _SH_ StdoutEvent => 'got_line', ); $heap->{seen_input} = 0; $heap->{timeout} = 10; $heap->{start} = time; $kernel->delay_set( timeout => $heap->{timeout} ); } sub got_line { my ( $heap, $line ) = @_[ HEAP, ARG0 ]; warn sprintf "%02d line: $line$/", time - $heap->{start}; $heap->{seen_input} = 1; } sub timeout { my ( $heap, $kernel ) = @_[ HEAP, KERNEL ]; warn sprintf "%02d timeout_check$/", time - $heap->{start}; unless ( $heap->{seen_input} ) { warn "\tseems to have died$/"; $heap->{wheel_run}->kill; delete $heap->{wheel_run}; return; } warn "\tseems to still be kicking$/"; $heap->{seen_input} = 0; $kernel->delay_set( timeout => $heap->{timeout} ); } POE::Kernel->run; __END__ 00 line: kick 04 line: kick 08 line: kick 10 timeout_check seems to still be kicking 12 line: kick 20 timeout_check seems to still be kicking 30 timeout_check seems to have died

i'm sure there's a cleaner way that i haven't learned yet.