in reply to Testing for a background process waiting for input

What I really need to be able to do is to check the background program to see if it's stalled waiting for input

Based on the idea that an attached strace would typically show the line

read(0,

(and wait there) in case the respective program is waiting for user input, you could check if you get nothing but this within a certain period of time (3 secs in the sample):

#!/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

Of course, that would require a platform that has strace or similar...

Replies are listed 'Best First'.
Re^2: Testing for a background process waiting for input
by SBECK (Chaplain) on Apr 14, 2012 at 00:23 UTC
    I'd thought of strace, and was hoping to use a pure perl solution, but I can't think of one, so maybe that's what I'm stuck with. Not the end of the world I suppose.