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...
In reply to Re: Testing for a background process waiting for input
by Eliya
in thread Testing for a background process waiting for input
by SBECK
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |