My first reaction is that you have 3 processes running FTP trying to authenticate to the remote server, each with all of their commands buffered up when your script runs ahead and deletes all of the files. A short while later, each FTP process gets authenticated and reads the commands from the input buffer and can't access the files that have already been deleted.

The only thing that makes me think this shouldn't be the case is:

close (CMD);
But this is indented differently than the rest of your script so perhaps you added that to the posting but it isn't actually in the code that is causing you problems.

You see, an explicit close on a file handle to a piped command also waits for the subprocess to exit. So the presence of that code should make what I described very unlikely.

My second reaction is "Don't you ever check for failure?!" I can almost excuse a quick hack missing some checks for failure. But once that quick hack starts not working the way you expected, one of the first things you need to do is add any checks for failure that you left out at first. Well, you left them all out:

sub fail { # Allow failures to show on the web page. print @_; exit 0; } foreach $wmlfile (@fileftp) { if(-f $wmlfile) { $ftp_commands = " open $remotehost1 user $remoteuser $remotepass cd $remotepath asc put $wmlfile bye "; open (CMD, "|$cmd") or fail "Can't fork() to run $cmd ($wmlfile): $!\n"; print CMD $ftp_commands or fail "Can't write commands to $cmd ($wmlfile): $!\n"; close (CMD) or fail "$cmd ($wmlfile) failed? ($?): $!\n"; print "File $wmlfile has been transferred \n"; print "<br>\n"; $finish = 'transfer'; copy ($wmlfile,"./$finish/$wmlfile") or fail "Can't save $wmlfile to $finish: $!\n"; } }

The error message for close failing is a bit ambiguous because it failing could mean the subprocess returned a non-zero status or it could be some error in the parent process such as not being able to flush some buffered input (thought the subprocess failing seem by far the most likely reason in this case).

Update: I've replaced the calls to die so that the errors would be visible on the web page, since this is a CGI script.

        - tye (but my friends call me "Tye")

In reply to Re: Confuse and lost in Transfer files process by tye
in thread Confuse and lost in Transfer files process by vrempire

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.