read(0, #### #!/usr/bin/perl -w use strict; $SIG{CHLD} = 'IGNORE'; my $pid = fork(); die $! unless defined $pid; unless ($pid) { # run background program to watch exec q(exec perl -E 'for (1..10) {say "...working"; sleep 1} <>'); exit; } sub check { my $pid = shift; my $pid2 = open my $strace, "-|", "strace -qp $pid 2>&1" or die $!; local $SIG{ALRM} = sub { kill INT => $pid2 }; print "checking...\n"; alarm 3; my $trace; $trace.=$_ while <$strace>; alarm 0; close $strace; if ($trace =~ /^read\(.*$/) { # check strace output print "=> hanging\n"; kill TERM => $pid; # (optional) return 0; } else { print "=> still running\n"; return 1; } } 0 while check($pid); __END__ $ ./964971.pl checking... ...working ...working ...working => still running checking... ...working ...working ...working => still running checking... ...working ...working ...working => still running checking... ...working => still running checking... => hanging