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

Hi Monks,

Bare with me as I try to explain this...

I've hit a roadblock with a script that I'm working on. It's a script that runs as a daemon after detaching from the shell.

It checks the database for work to do and when it finds work it spawns a child process to do the work and reaps the child process and the cycle continues.

The problem is that I need to transfer some files over to a secondary server and I've decided on Net::SFTP::Foreign as it seems to be the fastest based on all the testing that I've done.

I've setup a small test script which works great. When I try to transfer this code over to the daemonized script it refuses to connect.

After many hours of debugging it appears that it is related to:

close (STDOUT); close (STDIN); close (STDERR);

If I don't close() STDOUT, STDERR and STDIN then the code related to Net::SFTP::Foreign functions properly and everything works great.

The problem is I am under the impression that close()'ing STDOUT, STDERR and STDIN is required to completely detach processes from parents.

Can anyone provide some wisdom on this one?

-- koyrist

Replies are listed 'Best First'.
Re: Net::SFTP::Foreign use in Daemonized script
by salva (Canon) on Oct 24, 2011 at 07:31 UTC
    That problem is caused by a bug in IPC::Open3. Try the latest development version of Net::SFTP::Foreign that does not use it.

    You may also need to add stderr_discard => 1 into the constructor call (the module already detects a closed STDERR and handles it, I had forgotten it!)

      Thanks salva!

      That did the trick. A quick download of the dev version you've linked to and the script worked like a charm.

      -- koyrist