in reply to Perl script crashing at lockfile ?

Hi,

With replacing the code, the script is getting further now. It is stopping or just sitting at the following block of code

open(ORDERFILE, ">$outfile") or diehtml("Can't open order records: $!\n"); print ORDERFILE @_; close ORDERFILE or warn "Something fishy with closing the order: $ +!\n";

The value of the variable $outfile has been printed before the above code, and is "/home/username/public_html/.orders/2003-10-01-0001130"

There were other "open" commands performed successfully, prior to _this_ open stopping ?

Peter

Replies are listed 'Best First'.
Re: Re: Perl script crashing at lockfile ?
by peterr (Scribe) on Oct 02, 2003 at 04:53 UTC
    Should I replace the following with a 'sysopen' function, like in the locking example ?

    open(ORDERFILE, ">$outfile")

    Peter

      Hi,

      Well, that worked, it has now actually created the ascii order file, and gone much further. Now it is stopping/doing nothing here

      open(SENDMAIL, '|/usr/sbin/sendmail -oi -t') or (unlink ($outfile), diehtml("Can't fork for sendmail: $!\n"));
      So, .... it looks like the moral to this story is replace ALL open() with sysopen(), using the parameters and examples as supplied, to fix the locking example.

      If I used this code as a template for all the file opens

      my $got_lock; use Fcntl; # to get constants for O_CREAT | O_EXCL | O_RDWR for ( 0 .. 5 ) { if ( sysopen(my $fh, "$base_dir/.lock", O_CREAT | O_EXCL | O_RDWR, + 0600) ) { $got_lock = 1; close $fh; last; } sleep 2; } diehtml("Lock error $!\n") unless $got_lock;
      .... would I need the 'sleep', and what does the FOR contruct do ? Does it try for 6 times ?? Please pardon my ignorance, I'm _very_ much a novice at Perl. :)

      Thanks,

      Peter

        Interestingly, I use the "NMS" FormMail.pl, which runs SENDMAIL from the same website, and there is not a problem. I see "NMS" uses a pipe

        sub newmail { my ($self, $scriptname, $postmaster, @recipients) = @_; my $command = $self->{Mailprog}; $command .= qq{ -f "$postmaster"} if $postmaster; my $pipe; eval { local $SIG{__DIE__}; $pipe = IO::File->new("| $command"); }; if ($@) { die $@ unless $@ =~ /Insecure directory/; delete $ENV{PATH}; $pipe = IO::File->new("| $command"); } die "Can't open mailprog [$command]\n" unless $pipe; $self->{Pipe} = $pipe; $self->output_trace_headers($scriptname); }
        At line 430 in the version of FormMail.pl I have

        use IO::File;
        .. is IO::File part of the NMS libraries, or a standard Perl one ? (I have no idea if they are called libraries)

        Peter