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

Hello All!

I've read through several threads here, and tried various things to get this to work, but its just not working for me....

What I need, is for my cgi script running under IIS to call an executable file(VB.Net), and let it go....then forget about it. So basically, I want to kick off the exe, and finish loading the page without waiting for the exe to finish.

I'm pretty sure that's easiest done with a fork and exec unde *nix, but I can't get it to do the same under IIS. I have tried the following:

#running some cgi code... system(1, "D:/ipms/bin/Medicaid/Console/MedicaidEHRService 123456"); #continue cgi code....
#run all cgi code for the script exec("D:/ipms/bin/Medicaid/Console/MedicaidEHRService 123456");
#run all cgi code for the script exec("start 'D:/ipms/bin/Medicaid/Console/MedicaidEHRService 123456'") +;
#running some cgi code... Win32::Process::Create($child_proc, "D:/ipms/bin/Medicaid/Console/Medi +caidEHRService.exe", "MedicaidEHRService 123456", 0, "DETACHED_PROCES +S", ".") || print "Could not spawn child: $!"; #continue cgi code....
#running some cgi code... my $proc2 = Proc::Background->new("D:/ipms/bin/Medicaid/Console/Medica +idEHRService 123456"); #continue cgi code....
#run all cgi code for the script close(STDOUT); close(STDERR); close(STDIN); exec("D:/ipms/bin/Medicaid/Console/MedicaidEHRService 123456");

All but the last two wait for the exe to finish before completing the script...thus causing IIS to wait to serve the page until the script is run. The Proc::Background and close all buffers approach (the last two) seem to work to make IIS go ahead and serve the page, but the output file from the exe never gets written.

Any ideas on what I'm doing wrong?

Replies are listed 'Best First'.
Re: Running detached processes with Activeperl under IIS
by BrowserUk (Patriarch) on May 12, 2009 at 01:16 UTC
    All but the last two wait for the exe to finish before completing the script ...

    You're misinterpreting the symptoms.

    1. system 1, ... will return to your script immediately.

      The waiting occurs within the web server itself. Here's why.

      When a webserver starts a cgi script, it supplies (via inheritance) that script with it standard handles: stdin; stdout; and stderr. It then waits for those handles to close before it transmits the output from the script to the browser.

      But when you call system 1, ... within the cgi, that child process inherits its standard handles from the cgi script. So, even though your script finishes and perl.exe exits, the standard handles it inherited are still being held open by the new process. So the webserver continues to wait until those handles are closed, which won't be until that new process (MedicaidEHRService.exe) completes.

    2. exec .... Ditto. The process that replaces perl.exe will inherit the standard handles; the webserver waits.
    3. exec "start ...". Ditto again.

      Might work if you added the /b parameter to the start command.

    4. Win32::Process::Create( .... Will probably work once you pass DETACHED_PROCESS correctly.
    5. With the last two, the standard handles are closed, so the webserver detects eof and completes the transaction.

      But, and I can only speculate here as I don't have that particular executable, the program you are running must need the one or more of the standard handles for some reason to work correctly, and fails because they are closed.


    Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
    "Science is about questioning the status quo. Questioning authority".
    In the absence of evidence, opinion is indistinguishable from prejudice.

      Thanks for the pointers all.

      I tried adding the /d to the system command, and taking the quotes off of DETACHED_PROCESS...but it still waits....

      However, my exe is a console app...so maybe that's why. I didn't realize there was a difference in the way they are handled.

      I'm going to go back and see if I can convert it to a Windows app and get it to run...maybe that will help.

Re: Running detached processes with Activeperl under IIS
by ikegami (Patriarch) on May 11, 2009 at 22:09 UTC
    "DETACHED_PROCESS" is not a valid value. You want DETACHED_PROCESS, the constant that holds a numerical value.

    I'm pretty sure that's easiest done with a fork and exec unde *nix

    Windows has neither system calls.

Re: Running detached processes with Activeperl under IIS
by John M. Dlugosz (Monsignor) on May 11, 2009 at 23:10 UTC
    Targeting Windows, I'd use Win32's CreateProcess directly, as the exec/system stuff is a real mess and I end up carefully setting things up to take the program path I wanted.

    I think "DETACHED_PROCESS" vs DETACHED_PROCESS (the constant) is the problem with that one.

    In any case, whether it (by default) waits for the process to complete depends on the subsystem used by the target executable. Console programs wait, Win32 programs don't.