Beefy Boxes and Bandwidth Generously Provided by pair Networks
Keep It Simple, Stupid
 
PerlMonks  

Debugging forking scripts in screen

by harleypig (Monk)
on Feb 09, 2007 at 01:09 UTC ( [id://599145]=perlquestion: print w/replies, xml ) Need Help??

harleypig has asked for the wisdom of the Perl Monks concerning the following question:

I've got the following subroutine working relatively well for debugging forking processes in a screen session.

I'd like to submit it to whoever is maintaining the perl5db.pl file, or at least to rt.cpan.org. But before I do that, I'd like to make it as robust as possible.

I wasn't sure where else to put this--and since this is a request for the collective wisdom to evaluate the code this seemed as best a place as any. Please let me know if you think this can go better elsewhere.

Please note the following:

  • Detecting whether we are actually under screen takes place elsewhere in perl5db.pl.
  • If you exit the parent process before the child process(es) you're next debugging fork will be screwed up. I don't know why
Here's the subroutine:
sub DB::get_fork_TTY { require File::Temp or return ''; my ( $FH, $filename ) = File::Temp::tempfile( UNLINK => 1 ); system( qq{screen -t 'Child $$' sh -c "tty > $filename ; sleep 10000 +00"} ) == 0 or return ''; chomp ( my $tty = <$FH> ); return $tty; }
And the test code I've been using it on:
#!/usr/bin/perl -w use strict; sub DB::get_fork_TTY { require File::Temp or return ''; my ( $FH, $filename ) = File::Temp::tempfile( UNLINK => 1 ); system( qq{screen -t 'Child $$' sh -c "tty > $filename ; sleep 10000 +00"} ) == 0 or return ''; chomp ( my $tty = <$FH> ); return $tty; } if ( my $child = fork ) { $DB::single = 1; print "We're in the parent! ($child)\n"; } else { die "Can't fork" unless defined $child; $DB::single = 1; print "We're in the child!\n"; } exit;
Added check for failed fork as suggested
Harley J Pig

Replies are listed 'Best First'.
Re: Debugging forking scripts in screen
by kyle (Abbot) on Feb 09, 2007 at 02:43 UTC

    You should check whether fork actually worked. When it fails, it returns undef, and your script will think it succeeded, and that it is the child. The perlipc page has an example I'm paraphrasing:

    if ( my $pid = fork() ) { # parent } else { die "Can't fork: $!" if ( ! defined $pid ); # child }

      Thanks. I know about that ... the second code block was what I used to check the get_fork_TTY subroutine. It's not the script that I'm debugging.

      Harley J Pig

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: perlquestion [id://599145]
Approved by GrandFather
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others scrutinizing the Monastery: (1)
As of 2024-04-25 04:06 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found