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...