2008-09-05 16 views
6

Mam pewne problemy z rozwidlaniem procesów ze skryptu Perl CGI podczas pracy w systemie Windows. Wydaje się, że głównym problemem jest emulacja "widelca" podczas pracy w systemie Windows i nie wydaje się, aby tworzył on nowy proces (tylko kolejny wątek w bieżącym). Oznacza to, że serwery WWW (takie jak IIS), które czekają na zakończenie procesu, czekają aż proces "tła" się zakończy.Jak mogę rozwidlić procesy w tle ze skryptu CGI Perl w systemie Windows?

Czy istnieje sposób rozwidlenia procesu w tle ze skryptu CGI w systemie Windows? Co więcej, czy istnieje jedna funkcja, którą mogę nazwać, która zrobi to na wiele sposobów?

(Tylko po to, aby uczynić życie jeszcze trudniejszym, bardzo bym chciał przekierować wyjście z rozwidlonych procesów do pliku w tym samym czasie).

Odpowiedz

9

Jeśli chcesz zrobić to w sposób niezależny od platformy, Proc::Background jest prawdopodobnie najlepszym sposobem.

0

perlfork:

Perl zapewnia fork() słów kluczowych, które odpowiada wywołania systemowego Unix tej samej nazwie. Na większości uniksopodobnych platformach , w których dostępny jest system fork() , fork Perla() po prostu wywołuje go.

Na niektórych platformach, takich jak Windows gdzie fork() funkcja systemowa nie jest dostępny, Perl może być zbudowany do naśladować fork() na tłumacza poziomie. Natomiast emulacja jest przeznaczony być możliwie jak najbardziej zgodny z prawdziwy fork() na poziomie program Perl, istnieją pewne istotne różnice, które wynikają z fakt, że wszystkie potomne pseudo `` procesy "utworzony w ten sposób na żywo w ten sam rzeczywisty proces w odniesieniu do systemu operacyjnego .

0

Znalazłem prawdziwe problemy z fork() w systemie Windows, szczególnie w przypadku Win32 Objects w Perlu. Jeśli więc będzie to specyficzne dla systemu Windows, naprawdę poleciłbym przejrzeć bibliotekę wątków w Perlu.

Używam tego do dobrego efektu, przyjmując jednocześnie więcej niż jedno połączenie na stronach internetowych korzystających z IIS, a następnie używając jeszcze większej liczby wątków do jednoczesnego wykonywania różnych skryptów.

0

To pytanie jest bardzo stare, a zaakceptowana odpowiedź jest prawidłowa. Jednak właśnie to zadziałało i doszedłem do wniosku, że dodam trochę więcej szczegółów na temat tego, jak to osiągnąć dla każdego, kto tego potrzebuje.

Następujący kod istnieje w bardzo dużym skrypcie CGI Perla. Ta konkretna podprogram tworzy bilety w wielu systemach biletowych, a następnie wykorzystuje zwrócone numery biletów do automatycznego połączenia za pośrednictwem usług Twilio. Połączenie trwa chwilę i nie chciałem, aby użytkownicy CGI musieli czekać do zakończenia połączenia, aby zobaczyć dane wyjściowe z ich żądania.W tym celu, zrobiłem co następuje:

(All the CGI code that is standard stuff. Calls the subroutine needed, and then) 

    my $randnum = int(rand(100000)); 
    my $callcmd = STL_DIR . "/aoff-caller.pl --uniqueid $uuid --region $region --ticketid $ticketid"; 
    my $daemon = Proc::Daemon->new(
    work_dir  => STL_DIR, 
    child_STDOUT => TMP_DIR . '/stdout.txt', 
    child_STDERR => TMP_DIR . '/stderr.txt', 
    pid_file  => TMP_DIR . '/' . $randnum . '-pid.txt', 
    exec_command => $callcmd, 
); 
    my $pid = $daemon->Init(); 

    exit 0; 

    (kill CGI at the appropriate place) 

Jestem pewien, że liczba losowo generowane i dołączone do PID jest przesadą, ale nie mam żadnego interesu w tworzeniu problemów, które są bardzo łatwo uniknąć. Mam nadzieję, że pomoże to komuś, kto chce zrobić to samo. Pamiętaj, aby dodać use Proc::Daemon u góry skryptu, odzwierciedlić kod i zmienić ścieżki i nazwy programu, a powinieneś być gotowy.