perlquestion blindluke <p>Enlightened Monks!</p> <p> I'm trying to run a command that runs some kind of interactive shell, executes a script, and then stays in the shell. It's stubborn, and does not exit the shell, even if I explicitly provide an exit command in the script file. Also, it hangs frequently, so I cannot be sure that for a given script, I will receive any output (so I cannot use a solution that would open the command with a pipe, then read first X lines, then kill it). </p> <p> Right now, I'm trying to adopt the idea found here: [id://887317]. I want all the lines, so I modified it a bit. This is the code after my modifications, and the way I use this sub later: </p> <code> sub cmd_wrapper { my $timeout = shift; my $cmd = shift; my @out; # all lines of output my $return_code; eval { local $SIG{ALRM} = sub { die "alarm\n" }; alarm $timeout; @out = (`$cmd`); $return_code = $?; alarm 0; }; if( $@ ) { die "Eval failed for $cmd for unknown/unexpected reasons" if $@ ne "alarm\n"; die "Eval failed for $cmd because alarm timed out"; } die "Return code undefined for $cmd" unless defined $return_code; return $return_code, @out if wantarray; return $return_code; } @cmdoutput = cmd_wrapper(15, "my_stubborn_shell -c $filename"); # Will timeout in 15 seconds $cmd_ret_code = shift @cmdoutput; </code> <p> This, however, does not work. It just times out with "Eval failed because alarm timed out". How can I gather the output, and then kill the program, after a given time (let's say, 20 seconds)? </p> <p> I could always do it with [mod://Expect] (especially since I can exit the shell without problems when in interactive mode), but maybe there is an easier solution. If [mod://Expect] is the right way to do this, please, let me know. </p> <p>regards,<br> Luke Jefferson</p>